LeetCode刷题记170
1202. 交换字符串中的元素
class Solution {
int[] pa;
public void init(int n) {
pa = new int[n];
for (int i = 0; i < n; i ++) {
pa[i] = i;
}
}
public int find(int x) {
if (x == pa[x]) return x;
pa[x] = find(pa[x]);
return pa[x];
}
public void join(int x, int y) {
int pax = find(x);
int pay = find(y);
if (pax < pay) {
pa[pay] = pax;
} else if (pax > pay){
pa[pax] = pay;
}
}
public String smallestStringWithSwaps(String s, List<List<Integer>> pairs) {
if (s.length() == 1) return s;
char[] chars = new char[s.length()];
for (int i = 0; i < s.length(); i ++) {
chars[i] = s.charAt(i);
}
init(s.length());
for (int i = 0; i < pairs.size(); i ++) {
join(pairs.get(i).get(0), pairs.get(i).get(1));
}
PriorityQueue<Pair<Integer, Character>>[] groups = new PriorityQueue[s.length()];
for (int i = 0; i < s.length(); i ++) {
pa[i] = find(i);
if (groups[pa[i]] == null) {
groups[pa[i]] = new PriorityQueue<Pair<Integer, Character>>(new Comparator<Pair<Integer, Character>>() {
@Override
public int compare(Pair<Integer, Character> a, Pair<Integer, Character> b) {
if (a.getValue() == b.getValue()) return a.getKey() - b.getKey();
return a.getValue() - b.getValue();
}
});
}
groups[pa[i]].add(new Pair(i, chars[i]));
}
String ans = "";
for (int i = 0; i < s.length(); i ++) {
int id = i;
int pai = find(i);
while (!groups[pai].isEmpty()) {
Pair<Integer, Character> tmp = groups[pai].peek();
if (tmp.getKey() <= i) {
groups[pai].poll();
if (tmp.getKey() == i) break;
} else {
if (tmp.getValue() < chars[i]) {
groups[pai].poll();
id = tmp.getKey();
}
break;
}
}
ans += chars[id];
if (id != i) {
char ch = chars[id];
chars[id] = chars[i];
chars[i] = ch;
groups[pai].add(new Pair(id, chars[id]));
}
}
return ans;
}
}
我哭了,一个中等难度的并查集我都写不好,写了两个小时四十六分钟。。。我真菜。。。好烦躁啊啊啊啊啊啊