在C ++中查找和替换字符串
假设我们有一个字符串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