# 1202. Smallest String With Swaps ###### tags: `leetcode`,`priorityQueue`,`medium` >ref: https://leetcode.com/problems/smallest-string-with-swaps/ > You are given a string s, and an array of pairs of indices in the string pairs where pairs[i] = [a, b] indicates 2 indices(0-indexed) of the string. You can swap the characters at any pair of indices in the given pairs any number of times. Return the lexicographically smallest string that s can be changed to after using the swaps. ![](https://i.imgur.com/tRMAKVg.png) >Constraints: 1 <= s.length <= 10^5 0 <= pairs.length <= 10^5 0 <= pairs[i][0], pairs[i][1] < s.length s only contains lower case English letters. >1. timeResolution:O(N) loop all space O(N) >2. 分組後排序 利用int[] 進行組紀錄 >3. find 進行組查找 >4. priorityQueue 進行同組排序 ```java= public String smallestStringWithSwaps(String s, List<List<Integer>> pairs) { int[] group = new int[s.length()]; for(int i=0;i<group.length;i++){ group[i]=i; } for(int i=0;i<pairs.size();i++){ int b1=find(group,pairs.get(i).get(0)); int b2=find(group,pairs.get(i).get(1)); int connect=Math.min(b1,b2); group[b1]=connect; group[b2]=connect; } Map<Integer,PriorityQueue<Character>> pile = new HashMap<>(); for(int i=0;i<group.length;i++){ int base=find(group,i); if(!pile.containsKey(base)){ pile.put(base,new PriorityQueue<Character>()); } pile.get(base).add(s.charAt(i)); } StringBuilder ans=new StringBuilder(); for(int base:group){ ans.append(pile.get(base).poll()); } return ans.toString(); } private int find(int[] arr, int idx){ while(arr[idx]!=idx){ arr[idx]=arr[arr[idx]]; idx=arr[idx]; } return arr[idx]; } ```