1202.交换字符串中的元素
1202.交换字符串中的元素
1:42
1交换 2.按着字典序排序 3.拼接字符串
1.根据这个二维数组pairs,获取可以交换的字母,然后可以交换的字母组成一组。
2.对组内的字母进行排序。
3.接着根据字符串中组号获取我们组内最小的字符进行拼接。最后得到的字符串就是我们所需要的进行排过序的字符串;
// 定义并查集类
class UnionFind{
// 构造函数初始化并查集
constructor(n){
this.parent = new Array(n).fill(0).map((item,index)=>index)
this.rank = new Array(n).fill(1)
this.count = n
}
// 查找元素的根节点
find(x){
if(this.parent[x] !== x){
this.parent[x] = this.find(this.parent[x])
}
return this.parent[x]
}
// 合并两个集合
union(x,y){
let rootX = this.find(x)
let rootY = this.find(y)
if(rootX === rootY){
return false
}
if(this.rank[rootX] < this.rank[rootY]){
this.parent[rootX] = rootY
this.rank[rootY] += this.rank[rootX]
}else{
this.parent[rootY] = rootX
this.rank[rootX] += this.rank[rootY]
}
this.count--
}
// 判断两个元素是否属于同一个集合
connected(x,y){
return this.find(x) === this.find(y)
}
// 获取集合的数量
getCount(){
return this.count
}
}
/**
* @param {string} s
* @param {number[][]} pairs
* @return {string}
*/
var smallestStringWithSwaps = function(s, pairs) {
let len=s.length
let uf = new UnionFind(len)
//1.将可以进行交换的字符进行联通
for(let i=0;i<pairs.length;i++){ //先拿到索引对,遍历数组
let index1 = pairs[i][0] //拿到里面的每一对数组
let index2 = pairs[i][1]
if(uf.find(index1)!==uf.find(index2)){ //拿到两个索引,进行联通
uf.union(index1,index2)
}
}
//2.先拿到联通后的数组
let fa=uf.parent;
//将联通的字符存入到一个新的数组里面进行排序
let vec=new Array(len).fill(0).map(()=>new Array());//根据祖先节点进行分组,value 是组里面的字符串的结合
for(let i=0;i<len;i++){
fa[i]=uf.find(i)
vec[fa[i]].push(s[i])
}
for(let i=0;i<len;i++){
if(vec[i].length>0){
vec[i].sort((a,b)=>a.charCodeAt()-b.charCodeAt()) //按着字典序排序//ASCII
}
}
//3.通过原始字符坐标,获取字符的组号,拼接字符串
//记录每一组字符串位置
let p=new Array(len).fill(0)
//输出字符的数组
let ans=[]
for(let i=0;i<len;i++){
ans.push('1')
}
//通过原始字符坐标,获取字符的组号,拼接字符串
for(let i=0;i<len;i++){
ans[i]=vec[fa[i]][p[fa[i]]]
p[fa[i]]++
}
return ans.join('')
};
let s = "dcab", pairs = [[0,3],[1,2]]
console.log(smallestStringWithSwaps(s,pairs))

浙公网安备 33010602011771号