题目大意:检查拼写是否有错误。给你一个字典,然后给你要查询的单词,判断一个单词是否正确有以下规则:1.字典里面有这个单词2,删除一个字母,3增加一个字母4,替换任意一个字母。
算法:其实没什么算法,就是扫描一遍字典,比较目标字符串和字典字符串的长度,分三种情况:等长,少一个,多一个字母。
代码:
#include<stdio.h>
#include<string.h>
char str[10010][20],s[20];
int used[10010],n;
int judge()
{
int i,j,k,l,m;
int len;
len=strlen(s);
for(i=0;i<n;i++)
{
l=strlen(str[i]);
if(len==l)//等长
{
if(strcmp(str[i],s)==0)
return 1;
else
{
k=0;
for(j=0;j<len;j++)
{
if(str[i][j]!=s[j])
k++;
}
if(k==1)
{
used[i]=1;
continue;
}
}
}
else
{
if(len==l-1)//长度少1
{
k=0;m=0;
for(j=0;j<len;j++)
{
while(k<l)
{
if(s[j]==str[i][k])
{
m++;
k++;//不要忘记啊相等的时候都要后移。判断最长公共子串。
break;
}
else
k++;
}
}
if(m==len)
{
used[i]=1;
continue;
}
}
else if(len==l+1)
{
k=0;m=0;
for(j=0;j<l;j++)
{
while(k<len)
{
if(s[k]==str[i][j])
{
m++;
k++;
break;
}
else
k++;
}
}
if(m==l)
{
used[i]=1;
continue;
}
}
}
}
return 0;
}
int main()
{
int i,j;
n=-1;
while(1)
{
n++;
scanf("%s",str[n]);
if(str[n][0]=='#')
break;
}
while(1)
{
j=0;
memset(used,0,sizeof(used));
scanf("%s",s);
if(s[0]=='#')
break;
if(judge())
printf("%s is correct/n",s);
else
{
printf("%s:",s);
for(i=0;i<n;i++)
{
if(used[i]==1)
{
j=1;
printf(" %s",str[i]);
}
}
if(j==0)
printf(" ");//注意如果没有正确的依然要打空格。
printf("/n");
}
}
return 0;
}