关于字符串处理
在这道题中,主要是要把原字符串的指定子串修改为新的子串.
而在string这一类中,我们有str.replace函数,作用相同.
那么这样本题就完成了.
程序实现
#include<bits/stdc++.h>
using namespace std;
string astr,bstr,ar[8],br[8];
map<string ,int >mp;//mp数组统计步数
map<string ,bool >check;//check数组检查一个状态是否使用过
int n,ans=-1;
void bfs(){
queue<string>q;
q.push(astr);
mp[astr]=0;check[astr]=true;
while(!q.empty()){
string str=q.front();
if(str==bstr){ans=mp[str];break;}
else if(mp[str]>10)break;
q.pop();
for(int i=0;i<n;i++){
for(int j=0;j<str.size();j++){
if(str[j]==ar[i][0]){
bool flag=true;
for(int k=1;k<ar[i].size();k++){
if(ar[i][k]!=str[j+k]){flag=false;break;}
}
if(flag){
string nwstr;
nwstr.assign(str);//等价于nwstr=str;
nwstr.replace(j,ar[i].size() ,br[i],0,br[i].size() );
//把nwstr的从j标号开始(不含)的长度为ar[i].len的子串替换成br[i]串
//注意在内存空间中,字符串下标从0开始,但是在标号中从1开始,这样(0,br[i].size())表示的就是全串了
if(check[nwstr])continue;
check[nwstr]=true;
q.push(nwstr);
mp[nwstr]=mp[str]+1;
}
}
}
}
}
if(ans>=0)printf("%d\n",ans);
else printf("NO ANSWER!\n");
}
int main(){
cin>>astr>>bstr;
while(cin>>ar[n]>>br[n])++n;//只有linux系统才运行得起来的输入
bfs();
return 0;
}