AcWing 770. 单词替换(c++详细注释)
原题链接
中等
作者:
九里今天学点什么呢
,
2021-04-20 13:37:24
,
所有人可见
,
阅读 304
#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
using namespace std;
int main(){
string s,a,b;
getline(cin,s);
cin>>a>>b;
int flag=0;//记录比对到a的哪一位
bool flag_before=0;//记录当前是否进入比对状态,已进入为1,未进入为0
for(int i=0;s[i];i++){
//用于判断是否进行比对
if(s[i]==a[flag] //字符串当前位与单词对应位相同
&&((flag_before)//已经比对
||(!flag_before&&(i==0||s[i-1]==' ')&&(s[i+a.size()]==' '||s[i+a.size()]=='\0'))))//还没比对
//确认单词开端,(i==0||s[i-1]==' ')表示当前位为首位或前面是空格
//确认单词末端,s[i+a.size()]==' '||s[i+a.size()]=='\0'确认当前单词长度与a长度相同
{
//进入比对,位数加一,比对状态为已进入,即flag_before=1
flag++;
flag_before=1;
//比对完成,进行替换,并重置比对位和状态
if(flag==a.size()){
s=s.substr(0,i-a.size()+1)+b+s.substr(i+1);
flag=0;
flag_before=0;
}
}else{//未进入比对,将比对状态置0
if(flag_before==1){
flag=0;
flag_before=0;}
}
}
puts(s.c_str());
}