leetcode-1202. Smallest String With Swaps
class Solution {
public:
void _union(unordered_map<int, pair<int, int>> &parents, int a, int b) {
int parent_a = _find(parents, a);
int parent_b = _find(parents, b);
if (parent_a == parent_b)return;
if (parents[parent_a].second <= parents[parent_b].second) {
parents[parent_a].first = parent_b;
parents[parent_b].second += parents[parent_a].second;
} else {
parents[parent_b].first = parent_a;
parents[parent_a].second += parents[parent_b].second;
}
}
int _find(unordered_map<int, pair<int, int>> &parents, int a) {
while (parents[a].first != a)a = parents[a].first;
return a;
}
string smallestStringWithSwaps(string s, vector<vector<int>> &pairs) {
if (pairs.empty())return s;
unordered_map<int, pair<int, int>> parents;
for (int i = 0; i < s.length(); ++i)parents[i] = {i, 1};
for (auto &pair:pairs)_union(parents, pair[0], pair[1]);
unordered_map<int, vector<char>> summary;
for (auto item:parents)summary[_find(parents, item.second.first)].push_back(s[item.first]);
for (auto &item:summary)sort(item.second.rbegin(), item.second.rend());
string result;
for (int i = 0, parent; i < s.length(); ++i) {
parent = _find(parents, i);
result.push_back(summary[parent].back());
summary[parent].pop_back();
}
return result;
}
};