給你一個字符串 s,以及該字符串中的一些「索引對」數組 pairs,其中 pairs[i] = [a, b] 表示字符串中的兩個索引(編號從 0 開始)。
你可以 任意多次交換 在 pairs 中任意一對索引處的字符。
返回在經過若干次交換后,s 可以變成的按字典序最小的字符串。
示例 1:
輸入:s = “dcab”, pairs = [[0,3],[1,2]]
輸出:“bacd”
解釋:
交換 s[0] 和 s[3], s = “bcad”
交換 s[1] 和 s[2], s = “bacd”
代碼
class Solution {int[] fa;public void init(){for(int i=0;i<fa.length;i++)fa[i]=i;}public int find(int x){if(x!=fa[x])fa[x]=find(fa[x]);return fa[x];}
/* public void union(int x,int y){fa[find(x)]=find(y);}*/public String smallestStringWithSwaps(String s, List<List<Integer>> pairs) {int n=s.length();fa=new int[n];init();for(List<Integer> t:pairs){union(t.get(1),t.get(0));}Map<Integer,List<Character> > map=new HashMap<>();for(int i=0;i<n;i++){int par=find(i);if(!map.containsKey(par)) map.put(par,new ArrayList<>());map.get(par).add(s.charAt(i));//紀錄同一個父節點的字符}for(List<Character > characters:map.values()){Collections.sort(characters);//將屬于同一個字符集的字符排序}StringBuilder stringBuilder=new StringBuilder();for(int i=0;i<n;i++)//將排序后的各個字符插回字符串中{List t=map.get(find(i));stringBuilder.append(t.remove(0));}return stringBuilder.toString();}public void union(int x,int y){x=find(x);y=find(y);if(x==y) return;fa[x]=y;}
}