- 使用數(shù)組求并集的技巧見ArrayUnion類
private static final int MAX = 100000;
public String smallestStringWithSwaps(String s, List<List<Integer>> pairs) {
// 并集分類
ArrayUnion union = new ArrayUnion(MAX);
for (List<Integer> pair : pairs) {
union.union(pair.get(0), pair.get(1));
}
HashMap<Integer, List<Integer>> map = new HashMap<>();
for (int i = 0; i < s.length(); i++) {
int key = union.find(i);
if (map.containsKey(key)) {
map.get(key).add(i);
} else {
List<Integer> list = new ArrayList<>();
list.add(i);
map.put(key, list);
}
}
// 排序
char[] ans = new char[s.length()];
for (List<Integer> indexList : map.values()) {
char[] chars = new char[indexList.size()];
int i = 0;
for (int index : indexList) {
chars[i++] = (s.charAt(index));
}
Arrays.sort(chars);
// Collections.sort(indexList); // indexList本來就是排好序的
i = 0;
for (Integer index : indexList) {
ans[index] = chars[i++];
}
}
return new String(ans);
}
static class ArrayUnion {
int[] parent;
public ArrayUnion(int len) {
parent = new int[len];
for (int i = 0; i < len; ++i)
parent[i] = i;
}
public int find(int x) {
return parent[x] != x ? parent[x] = find(parent[x]) : x; // 這里給parent[x]賦值是為了后面利用數(shù)組計算并集時,減少求key時find(x)遞歸調(diào)用的深度,不賦值,速度將會減慢
}
public void union(int x, int y) {
parent[find(x)] = find(y);
}
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。