在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