更新:更简练的一种做法
- 可以用str.find(key)!=string::npos表示str中含有key
- 可以用前后加空格的方式避免误改长单词中的key的情况
代码如下:
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
int main(){
string str,key,value;
getline(cin,str);str=" "+str+" ";
getline(cin,key);key=" "+key+" ";
getline(cin,value);value=" "+value+" ";
while(str.find(key)!=string::npos){
int plot=str.find(key);
str.erase(plot,key.size()).insert(plot,value);
}
cout<<str.substr(1,str.size()-2)<<endl;
return 0;
}
以下为原题解
基本思路:
while(true):
找到字符串中第一个key的位置
将第一个key改成value
但是可能会出现【找到的key并不是一个单词,而是某个更长的单词的组成部分】的情况。例如,要把read改成write,如果只按照上面的逻辑,会把bread也误改成bwrite。
因此,对每个找到的key,需要检查其是否为独立的单词。如果它不是独立的单词,可以暂时用一个pad单词覆盖(以便于下一次循环可以找到下一个key),等所有的key都改成value之后,再遍历一遍字符串,将所有的pad改成key。
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
int isword(string str,int plot,string key){
int s=0;int e=0;
if((plot==0)||(str[plot-1]==' '))s=1;
if(plot+key.size()==str.size()||str[plot+key.size()]==' ')e=1;
return s&&e;
}
int main(){
string str,key,value;
getline(cin,str);
getline(cin,key);
getline(cin,value);
string pad(str.size(),'1');
int plot=str.find(key);
while(plot>=0&&plot<str.size()){
if(!isword(str,plot,key)){
str.erase(plot,key.size()).insert(plot,pad);
plot=str.find(key);
continue;
}
str.erase(plot,key.size()).insert(plot,value);
plot=str.find(key);
}
//修改pad为key
plot=str.find(pad);
while(plot>=0&&plot<str.size()){
str.erase(plot,pad.size()).insert(plot,key);
plot=str.find(pad);
}
cout<<str<<endl;
return 0;
}