c++
class Solution {
public:
class UnionSet {
public:
int *father, n;
UnionSet(int n) : n(n) {
father = new int[n + 1];
for (int i = 0; i <= n; i++) {
father[i] = i;
}
}
int find(int x) {
return father[x] = (father[x] == x ? x : find(father[x]));
}
void merge(int a, int b) {
father[find(a)] = find(b);
return ;
}
};
string smallestStringWithSwaps(string s, vector<vector<int>>& pairs) {
UnionSet u(s.size());
priority_queue<char, vector<char>, greater<char>> h[s.size()];
for (auto pair : pairs) u.merge(pair[0], pair[1]);
for (int i = 0; i < s.size(); i++) {
h[u.find(i)].push(s[i]);
}
string ans;
for (int i = 0; i < s.size(); i++) {
ans += h[u.find(i)].top();
h[u.find(i)].pop();
}
return ans;
}
};
js
class UnionSet {
constructor(n) {
this.father = new Array(n);
for (var i = 0; i < n; i++) this.father[i] = i;
}
find(x) {
return this.father[x] = (this.father[x] == x ? x : this.find(this.father[x]));
}
merge(a, b) {
this.father[this.find(a)] = this.find(b);
}
};
var smallestStringWithSwaps = function(s, pairs) {
var u = new UnionSet(s.length);
var h = new Array(s.length).fill(0).map(() => Array());
for ([x, y] of pairs) u.merge(x, y);
for (var i = 0; i < s.length; i++) h[u.find(i)].push(s[i]);
for (var i = 0; i < s.length; i++) h[i].sort((a, b) => a.charCodeAt() - b.charCodeAt());
var ans = "";
for (var i = 0; i < s.length; i++) {
ans += h[u.find(i)].shift();
}
return ans;
};