假设我们给定了一个字符串s,并给定了一个在字符串对中的索引对数组,其中pair [i] = [a,b]表示该字符串的2个索引(0索引)。我们可以根据需要任意多次交换给定对中任意一对索引处的字符。我们必须找到在使用互换之后s可以更改为按字典顺序排列的最小字符串。因此,如果输入类似于s =“ dcab”,而对= [[0,3],[1,2]],则输出将为“ bacd”。交换s [0]和s [3],s =“ bcad”,然后交换s [1]和s [2],s =“ bacd”。
为了解决这个问题,我们将遵循以下步骤-
n:=数组大小,parent:=制作大小为n的数组,并用-1填充
制作一个称为ret的字符串,其大小为n,并用*填充
对于范围在0至成对大小中的i
u:=对[i,0]和v:=对[i,1]
如果u的父级与v的父级相同,则跳到下一个迭代
parent [u的父母]:= v的父母
定义大小为n的数组arr1
对于介于0到n – 1之间的i:将s [i]插入arr [i的父项]
对于范围从0到n – 1的i:通过从右侧读取值对arr [i]排序
对于i,范围为0到n – 1 −
ret [i]:= arr1的最后一个[i的父母]
从arr1删除最后一个节点[i的父节点]
让我们看下面的实现以更好地理解-
class Solution { public: vector <int> parent; int getParent(int x){ if(parent[x] == -1) return x; return parent[x] = getParent(parent[x]); } string smallestStringWithSwaps(string s, vector<vector<int>>& pairs) { int n = s.size(); parent = vector <int>(n, -1); string ret(n, '*'); for(int i = 0; i < pairs.size(); i++){ int u = pairs[i][0]; int v = pairs[i][1]; if(getParent(u) == getParent(v)) continue; parent[getParent(u)] = getParent(v); } vector < char > arr1[n]; for(int i = 0; i < n; i++){ arr1[getParent(i)].push_back(s[i]); } for(int i = 0; i < n; i++){ sort(arr1[i].rbegin(), arr1[i].rend()); } for(int i = 0; i < n; i++){ ret[i] = arr1[getParent(i)].back(); arr1[getParent(i)].pop_back(); } return ret; } };
"dcab" [[0,3],[1,2]]
输出结果
"bacd"