1 #define _for(i,a,b) for(int i = (a);i < b;i ++) 2 #define _rep(i,a,b) for(int i = (a);i > b;i --) 3 #define INF 0x3f3f3f3f 4 #define MOD 1000000007 5 #define pb push_back 6 #define maxn 100003 7 8 int par[maxn]; //父亲 9 int high[maxn]; //树的高度 10 11 void init(int n) 12 { 13 _for(i,0,n) 14 { 15 par[i] = i; 16 high[i] = 0; 17 } 18 } 19 20 int find(int x) 21 { 22 return par[x] == x ? x : par[x] = find(par[x]); 23 } 24 25 void unite(int x,int y) 26 { 27 x = find(x); 28 y = find(y); 29 if(x==y) return ; 30 31 if(high[x]<high[y]) 32 par[x] = y; 33 else 34 { 35 par[y] = x; 36 if(high[x]==high[y]) 37 high[x] ++; 38 } 39 } 40 41 bool same(int x,int y) 42 { 43 return find(x) == find(y); 44 } 45 46 class Solution 47 { 48 vector<int> a[maxn]; 49 public: 50 string smallestStringWithSwaps(string s, vector<vector<int>>& pairs) 51 { 52 int n = s.size(); 53 string rnt = s; 54 init(n); 55 _for(i,0,pairs.size()) 56 unite(pairs[i][0],pairs[i][1]); 57 58 _for(i,0,s.size()) 59 a[find(i)].pb(i); 60 61 _for(i,0,n) 62 { 63 string tmp; 64 _for(j,0,a[i].size()) 65 tmp += s[a[i][j]]; 66 sort(tmp.begin(),tmp.end()); 67 _for(j,0,a[i].size()) 68 rnt[a[i][j]] = tmp[j]; 69 } 70 return rnt; 71 } 72 };