leetcodeSolution to some Leetcode problems written in C++ |
git clone git://git.dimitrijedobrota.com/leetcode.git |
Log | Files | Refs | README | LICENSE |
1202.cpp (1042B)
0 class UnionFind {
1 vector<int> root, rank;
3 public:
4 UnionFind(int n) : root(n), rank(n, 1) { iota(root.begin(), root.end(), 0); }
6 int find(int x) {
7 if (x == root[x]) return x;
8 return root[x] = find(root[x]);
9 }
11 void join(int x, int y) {
12 x = find(x), y = find(y);
14 if (x != y) {
15 if (rank[x] > rank[y]) swap(x, y);
16 root[y] = x;
17 rank[x] += x == y;
18 }
19 }
20 };
22 class Solution {
23 public:
24 string smallestStringWithSwaps(string s, vector<vector<int>> &pairs) {
25 UnionFind uf(s.size());
26 vector<vector<char>> vs(s.size());
28 for (auto &p : pairs)
29 uf.join(p[0], p[1]);
31 for (int i = 0; i < s.size(); i++)
32 vs[uf.find(i)].push_back(s[i]);
34 for (auto &s : vs)
35 sort(s.rbegin(), s.rend());
37 for (int i = 0; i < s.size(); i++) {
38 int index = uf.find(i);
39 s[i] = vs[index].back();
40 vs[index].pop_back();
41 }
42 return s;
43 }
44 };