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
廣告