1202. 交换字符串中的元素
分类:图、并查集
同一个连通分量内的字符可任意交换,故各分量内部排序再放回原本位置
class Solution {
public:
int root(int *u, int p){
if (p != u[p])
u[p] = root(u, u[p]); //路径压缩优化
return u[p];
}
void connect(int *u, int i, int j){
u[root(u, j)] = root(u, i);
}
string smallestStringWithSwaps(string s, vector<vector<int>>& pairs) {
int *u = new int[s.size()];
for(int i=0; i<s.size(); i++) u[i] = i;
for(int i=0; i<pairs.size(); i++){
connect(u, pairs[i][0], pairs[i][1]);
}
priority_queue<char, vector<char>, greater<char> > qs[s.size()];
for(int i=0; i<s.size(); i++){
int indexOfSet = root(u, i);
qs[indexOfSet].push(s[i]);
}
string res;
for(int i=0; i<s.size(); i++){
int indexOfSet = root(u, i);
res.push_back(qs[indexOfSet].top());
qs[indexOfSet].pop();
}
delete[] u;
return res;
}
};/* 12% **/
2021/01/11