-
Notifications
You must be signed in to change notification settings - Fork 1
/
1202_smallest_string_with_swaps.cpp
79 lines (60 loc) · 2.12 KB
/
1202_smallest_string_with_swaps.cpp
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
这道题出的真的很好, 我做完了有一种“能做这么好的题真是幸福”的感觉...
/*
neal_wu的做法: 是把union_find作为一个DS单独写成struct, 之后每次要union_find的时候直接用这个就行了
其实下面这个就是做了三件事: init初始化, find(), unite(); 这里的unite是有返回值bool类型, 这里是用不
到的,但是其他的地方可能会用到
*/
struct union_find {
vector<int> parent;
vector<int> size;
int components = 0;
union_find(int n = 0) {
if (n > 0) init(n);
}
void init(int n) {
parent.resize(n+1);
size.assign(n+1, 1);
components = n;
for (int i = 0; i <=n; ++i) {
parent[i] = i;
}
}
int find(int x) {
return x == parent[x] ? x : parent[x] = find(parent[x]);
}
bool unite(int x, int y) {
x = find(x);
y = find(y);
if (x == y) return false;
if (size[x] < size[y]) swap(x, y);
parent[y] = x;
// UF对象中的每个components的size, 这里并没有用到, 但是可能有用
size[x] += size[y];
components--;
return true;
}
};
class Solution {
public:
string smallestStringWithSwaps(string s, vector<vector<int>>& pairs) {
int n = s.size();
union_find uf(n);
for (vector<int> &p : pairs)
uf.unite(p[0], p[1]);
vector<vector<int>> components(n, vector<int>());
// 遍历s,把所有的index对应的元素都放在不同的components中
// 每一个component中放的是所有联通的位置的index
for (int i = 0; i < n; ++i) {
components[uf.find(i)].push_back(i);
}
for (vector<int> &c : components) {
string chars;
for (int index : c)
chars += s[index];
sort(chars.begin(), chars.end());
for (int i = 0; i < (int) c.size(); ++i)
s[c[i]] = chars[i];
}
return s;
}
};