大概说一下思路,首先,根据题目意思,可以知道,要比较的字符串 s 可以是 字典中一个字符串增加、删除一个字母得到,也可以是替换掉一个字母或者完全相同,
那么在将s查找的时候我们可以分两种情况,第一:和s字符串大小相差一的去看看是不是增加或删除了,第二:字符串相同的我们可以看看是替换了字母还是完全相同
思路就在代码中....暴力
#include<cstdio> #include<string> #include<iostream> using namespace std; string dir[10005],ans[10005]; int flag; char ch[16]; string s; void get_dir()//获得字典信息 { while(scanf("%s",ch)) { s=ch; if(s =="#") break; else {//printf("%s\n",s.c_str()); dir[flag++]=ch; } } } void check() { int sum=0;//存放匹配的字符串个数 ans[sum++]=s;//最开始存放我们要比较的字符串 for(int i=0;i<flag;i++) { if(dir[i].size()==s.size()+1 || dir[i].size()==s.size()-1) //题目说可以是增加一个,删除一个,这里就考虑他们的大小只差是否为1 { int diff=0;//记录不同之处 int q=0,w=0; int flag=0; while(q<s.size()&&w<dir[i].size()) { if(diff>1)break; if(s[q]==dir[i][w]) {q++;w++;} else if(s.size()>dir[i].size()) {diff++;q++;}//注意这个地方,可以想象,我们只需要把长的那个单词移动一位, else { diff++;w++;} //而不能移动短的,如果移动了短的,后面就根本没法比较啦 } if(flag || diff>1) continue; else ans[sum++]=dir[i]; } else if(dir[i].size()==s.size())//这里就是看大小相等的情况,是正确,还是可以有一个字母被替换 { int flag1=0; if(dir[i]==s) { printf("%s is correct\n",s.c_str()); return; } else { for(int p=0;p<s.size();p++) if(dir[i][p]!=s[p]) flag1++; } if(flag1==1) { ans[sum++]=dir[i]; } } } //结果输出,前提是在没有找到正确单词并return的情况下 if(sum==1) { printf("%s:",ans[0].c_str()); } else for(int g=0;g<sum;g++) { if(g==0){printf("%s:",ans[g].c_str());} else printf(" %s",ans[g].c_str()); } printf("\n"); } int main() { flag=0; get_dir(); while(scanf("%s",ch)) { s=ch; if(s == "#") break; else check(); } return 0; }