1. 程式人生 > >九度OJ1111題-單詞替換

九度OJ1111題-單詞替換

string類型 一行 some clu ets 研究 arch tab 默認

題目1111:單詞替換

時間限制:1 秒

內存限制:32 兆

特殊判題:

提交:6752

解決:1891

題目描述:

輸入一個字符串,以回車結束(字符串長度<=100)。該字符串由若幹個單詞組成,單詞之間用一個空格隔開,所有單詞區分大小寫。現需要將其中的某個單詞替換成另一個單詞,並輸出替換之後的字符串。

輸入:
多組數據。每組數據輸入包括3行, 第1行是包含多個單詞的字符串 s, 第2行是待替換的單詞a,(長度<=100) 第3行是a將被替換的單詞b。(長度<=100) s, a, b 最前面和最後面都沒有空格.

輸出:
每個測試數據輸出只有 1 行, 將s中所有單詞a替換成b之後的字符串。

樣例輸入:
You want someone to help you
You
I
樣例輸出:
I want someone to help you
來源:
2007年北京大學計算機研究生機試真題
代碼:
 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string>
 4 #include <ctype.h>
 5 using namespace std;
 6 
 7 int main()    {
 8     char stra[201];
 9     while(gets(stra)){
10 string a = stra; 11 char strb[201]; 12 char strc[201]; 13 gets(strb); gets(strc); 14 string b = strb; string c = strc; 15 int pos = a.find(b, 0); 16 while(pos != string::npos) { 17 if ((a[pos-1] == || pos == 0) && (a[pos + b.size()] ==
) || a[pos + b.size()] == 0){ 18 a.erase(pos, b.size()); 19 a.insert(pos, c); 20 pos = a.find(b, pos); 21 } 22 else{ 23 pos = a.find(b, pos + b.size()); 24 } 25 } 26 cout << a << endl; 27 } 28 29 return 0; 30 31 }

一開始沒有寫 if ((a[pos-1] == ‘ ‘ || pos == 0) && (a[pos + b.size()] == ‘ ‘) || a[pos + b.size()] == 0){

這一行,導致一直是WA還不知道為什麽

應該是表示必須是“單詞替換”,所以被替換的地方前後都要有空格

或者是開頭(pos == 0)和結尾( a[pos + b.size()] == 0

對於 a[pos + b.size()] == 0要解釋一下:

因為是

char stra[201];

string a = stra;

所以在stra中沒有內容的部分默認是0,拷貝給a的都是有內容的部分,而string類型對於超出邊界的下標指向的字符,填充的正好也是0

所以 a[pos + b.size()] == 0表示超出了單詞長度,也就是被替換的是最後一個單詞(如果被替換了最後兩個單詞呢?這樣兩個單詞中間就有空格了!?)

其實這道題出的不好,並沒有說明白必須都是單詞,如果是單詞中的某個字符是不允許被替換的,所以要加限制條件

九度OJ1111題-單詞替換