C++字串查詢和替換


假設我們有一個字串S,我們將執行一些替換操作,用新的字元替換字元組。在每個替換操作中,有3個引數:起始索引i、源單詞x和目標單詞y。規則是:如果x從原始字串S的i位置開始,則我們將該x替換為y;否則,什麼也不做。

例如,如果我們有S = "abcd",並且有一個替換操作i = 2,x = "cd",y = "ffff",則因為"cd"從原始字串S的第2位開始,所以我們必須將其替換為"ffff"。

讓我們來看另一個例子,S = "abcd",如果我們有兩個替換操作:i = 0,x = "ab",y = "eee",以及另一個替換操作i = 2,x = "ec",y = "ffff",則第二個操作什麼也不做,因為在原始字串中S[2] = 'c',與x[0] = 'e'不匹配。

所以,如果我們有一個字串S = “abcd”,indices = [0,2],sources = [“a”, “cd”],targets = [“eee”, “ffff”],則輸出將是“eeebffff”。這是因為"a"從S的第0位開始,所以它被替換為"eee"。現在"cd"從S的第2位開始,所以它被替換為"ffff"。

為了解決這個問題,我們將遵循以下步驟:

  • 定義一個名為sorted的鍵值對陣列,n := indexes陣列的大小
  • 對於i從0到n – 1
    • 將鍵值對(indexes[i], i)插入到sorted中。
  • 將sorted按逆序排序
  • 對於j從0到n – 1
    • i := sorted[j]鍵值對的第一個值
    • src := sources[sorted[j]鍵值對的第二個值]
    • target := targets[sorted[j]鍵值對的第二個值]
    • 如果S從索引i到sources大小-1的子串與source相同,則
      • S := (S從索引0到i的子串)連線target,連線(S從i到sources大小-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

更新於:2020年5月5日

瀏覽量1K+

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告