假设我们有一个字符串S,我们将执行一些替换操作,用新的字母替换字母组。在每个替换操作中,有3个参数-起始索引i,源词x和目标词y。现在的规则是,如果x从原始字符串S中的位置i开始,那么我们将用y替换x的出现。否则,我们什么也不做。
因此,举个例子,考虑一下,如果我们有S =“ abcd”并有一些替换操作i = 2,x =“ cd”,y =“ ffff”,则因为“ cd”从原始字符串的位置2开始S,我们必须将其替换为“ ffff”。
让我们看看关于S =“ abcd”的另一个示例,如果我们同时具有替换操作i = 0,x =“ ab”,y =“ eee”,以及另一个替换操作i = 2,则x =“ ec” ,y =“ ffff”,第二个操作什么也不做,因为在原始字符串S [2] ='c'中,它与x [0] ='e'不匹配。
因此,如果我们有一个字符串S =“ abcd”,索引= [0,2],源= [“ a”,“ cd”],目标= [“ eee”,“ ffff”],那么输出将是“ eeebffff”。这是因为“ a”从S中的位置0开始,所以被“ eee”代替。现在,“ cd”从S的索引2开始,因此被“ ffff”代替。
为了解决这个问题,我们将遵循以下步骤-
定义一个成对的数组,称为有序的,n:=索引数组的大小
对于i,范围为0至n – 1
插入一对(indexes [i],i)进行排序。
反向排序
对于介于0到n – 1的j
S:=(从索引0到i的S的子字符串)连接目标,并串联(从i到源大小的S的子字符串– 1)
i:=排序对中的第一个值[j]
src:= sources [一对的第二个值sorted [j]]
目标:=目标[该对的第二个值排序[j]]
如果S的子串从索引i到源的大小– 1与源相同,则
返回S
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h> using namespace std; class Solution { public: string findReplaceString(string S, vector<int>& indexes, vector<string>& sources, vector<string>& targets) { vector < pair <int, int> > sorted; int n = indexes.size(); for(int i = 0; i < n; i++){ sorted.push_back({indexes[i], i}); } sort(sorted.rbegin(), sorted.rend()); for(int j = 0; j < n; j++){ int i = sorted[j].first; string source = sources[sorted[j].second]; string target = targets[sorted[j].second]; if(S.substr(i, source.size()) == source){ S = S.substr(0, i) + target + S.substr(i + source.size()); } } return S; } }; main(){ vector<int> v1 = {0, 2}; vector<string> v2 = {"a", "cd"}; vector<string> v3 = {"eee", "ffff"}; Solution ob; cout << (ob.findReplaceString("abcd", v1, v2, v3)); }
"abcd" [0, 2] ["a", "cd"] ["eee", "ffff"]
输出结果
eeebffff