额,这题,我好想看到分类说是用trie树,可是怎么想也没什么思路,就用了暴力了
若找不到相同的单词,则相似的也只有三种情况
代码很好理解
#include<iostream>
using namespace std;
#define MAXN 10001
char str[MAXN][20];
bool replace(char *a,char *b)
{
int l1=strlen(a);
int l2=strlen(b);
if(l1==l2)//修改一个字符
{
int i=0;
while(i<l1&&a[i]==b[i])//找到第一个不同的字符的位置
i++;
while(++i<l1)//看之后的字符是否相同
{
if(a[i]!=b[i])
return false;
}
}
else if(l1==l2+1)//添加一个字符的
{
int i=0;
while(i<l2&&a[i]==b[i])
i++;
while(++i<l1)//a跳过一个字符与b比较
{
if(a[i]!=b[i-1])
return false;
}
}
else if(l1+1==l2)//删除一个字符,下面类似
{
int i=0;
while(i<l1&&a[i]==b[i])
i++;
while(i++<l2)
{
if(a[i-1]!=b[i])
return false ;
}
}
else return false;
return true;
}
int main()
{
int i=0;
bool flag;
char c[20];
while(scanf("%s",str[i++])!=EOF&&strcmp(str[i-1],"#")!=0);
i--;
while(scanf("%s",c)!=EOF && strcmp(c,"#")!=0)
{
flag=false;
for(int j=0;j<i;j++)
if(strcmp(str[j],c)==0)
{
flag=true;
break;
}
if(flag)
printf("%s is correct\n",c);
else
{
printf("%s:",c);
for(int j=0;j<i;j++)
{
if(replace(str[j],c))
printf(" %s",str[j]);
}
printf("\n");
}
}
return 0;
}