-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsmallestStringWithSwaps.cpp
More file actions
37 lines (36 loc) · 947 Bytes
/
smallestStringWithSwaps.cpp
File metadata and controls
37 lines (36 loc) · 947 Bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class UnionFind {
private:
vector<int> parent;
public:
UnionFind(int n) {
parent = vector<int>(n);
for (int i = 0; i < n; ++i)
parent[i] = i;
}
int find(int a) {
if (a != parent[a])
parent[a] = find(parent[a]);
return parent[a];
}
void connect(int a, int b) {
parent[find(b)] = find(a);
}
};
class Solution {
public:
string smallestStringWithSwaps(string s, vector<vector<int>>& pairs) {
UnionFind uf(s.size());
for (auto &v: pairs) {
uf.connect(v[0], v[1]);
}
unordered_map<int, priority_queue<char, vector<char>, greater<char> > > data;
for (int i = 0; i < s.size(); ++i)
data[uf.find(i)].push(s[i]);
for (int i = 0; i < s.size(); ++i) {
int temp = uf.find(i);
s[i] = data[temp].top();
data[temp].pop();
}
return s;
}
};