[Codeup] 問題 D: 單詞替換
阿新 • • 發佈:2021-01-13
先把題目地址貼出來:(http://codeup.cn/problem.php?cid=100000580&pid=3)
輸入一個字串,以回車結束(字串長度<=100)。該字串由若干個單片語成,單詞之間用一個空格隔開,所有單詞區分大小寫。現需要將其中的某個單詞替換成另一個單詞,並輸出替換之後的字串。
輸入格式
多組資料。每組資料輸入包括3行,
第1行是包含多個單詞的字串 s,
第2行是待替換的單詞a,(長度<=100)
第3行是a將被替換的單詞b。(長度<=100)
s, a, b 最前面和最後面都沒有空格。
輸出格式
每個測試資料輸出只有 1 行,
將s中所有單詞a替換成b之後的字串。
樣例
Input
I love Tian Qin
I
You
Output
You love Tian Qin
題解
程式碼如下:
find + Replace :
#include<bits/stdc++.h>
using namespace std;
int main() {
string aa, sub, New;
while(getline(cin, aa))
{
cin >> sub >> New;
getchar();
int t = aa.find(sub);
while (t != string::npos){
aa = aa.replace(aa.begin()+t, aa.begin()+t+sub.size(), New);
t = aa.find(sub);
}
cout << aa << endl;
}
return 0;
}
很不幸,測試的字串由於太長,replace帶來的開銷太大。只能考慮換種解法。
於是想到,我們不一定非要將字串進行替換,只要能正確輸出即可。
所以:考慮以母串為aa,被替換子串sub,替換子串new。對母串進行遍歷,只有兩種情況:
- 到了其中sub子串的位置,以樣例中的輸入為例,遍歷到 I 的時候即滿足,輸出替換後的子串New,並且讓遍歷指標i後移一定的位數,相當於跳過母串中這裡的sub。
- 未到sub子串的位置,直接輸出原串該位,i++。
於是有以下程式碼:
修改後的:
#include<bits/stdc++.h>
using namespace std;
int main() {
string aa, sub, New;
while(getline(cin, aa))
{
cin >> sub >> New;
getchar(); //清除快取區的'\n'
for(int i = 0; i < aa.size(); )
{
if(i != aa.find(sub, i)) // 從當前位置開始查,若未遍歷到欲替換的子串
cout << aa[i++]; // 直接輸出並讓i++,輸出原串
else{ //到了該替換的地方,先輸出新串,再完成i滑動
cout << New;
i += sub.size();
}
}
cout << endl;
}
return 0;
}
Note
這也算是字串型別題的一個常見思路吧。增刪之類的操作會給線性錶帶來不小的開銷,如果題目卡資料的話很容易被卡住。此時如果能不對字串本身進行修改,換種方式正確輸出答案,往往可以很好地解決問題。