主要是用来学习并查集的思路,看了答案才下手的。
思路就是先对可交换的字符串进行分组,分组排序之后再组合起来
并查集就是用递归或者while循环实现find , 然后 再用数组和下标的方式实现union
var smallestStringWithSwaps = function(s, pairs) {
var fa = []
var find = function (x) {
if (x === fa[x]) {
return x
} else {
return fa[x] = find(fa[x])
}
}
for (let i = 0; i < s.length; i++) {
fa[i] = i
}
for(let i = 0 ; i < pairs.length ; i ++) {
const [x,y] = pairs[i]
fa[find(x)] = find(y)
}
var n = s.length // 计算分组后的map const vec = new Array(n).fill(0).map(() => new Array()); for (let i = 0; i < n; i++) {
fa[i] = find(i); vec[fa[i]].push(s[i]); }
console.log(fa)
// 对分组后的map 进行排序 for (let i = 0; i < n; ++i) {
if (vec[i].length > 0) {
vec[i].sort((a, b) => a.charCodeAt() - b.charCodeAt()); }
}
// 组合成ans const ans = new Array(n).fill(0); for (let i = 0; i < n; ++i) {
var group = fa[i]
if ( group!= undefined && vec[group].length) {
// 取出每个组中序号最小的 ans[i] = vec[fa[i]].shift()
} else {
ans[i] = s[i]
}
}
return ans.join('')
};