C ++中带有交换的最小字符串
假设我们给定了一个字符串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的父节点]
范例(C++)
让我们看下面的实现以更好地理解-
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"