1. 程式人生 > 其它 >[Codeup] 問題 D: 單詞替換

[Codeup] 問題 D: 單詞替換

技術標籤:codeup字串

先把題目地址貼出來:(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。對母串進行遍歷,只有兩種情況:

  1. 到了其中sub子串的位置,以樣例中的輸入為例,遍歷到 I 的時候即滿足,輸出替換後的子串New,並且讓遍歷指標i後移一定的位數,相當於跳過母串中這裡的sub。
  2. 未到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

這也算是字串型別題的一個常見思路吧。增刪之類的操作會給線性錶帶來不小的開銷,如果題目卡資料的話很容易被卡住。此時如果能不對字串本身進行修改,換種方式正確輸出答案,往往可以很好地解決問題。