大概说一下思路,首先,根据题目意思,可以知道,要比较的字符串 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;
}