参考
優YoU http://user.qzone.qq.com/289065406/blog/1309051410
using namespace std;
char dictionary[10010][20];
char word[55][20];
int dictNum=0;
int wordNum=0;
bool change(char *dict,char *w);
bool del(char *dict,char *w);
bool add(char *dict,char *w);
int main ()
{
while(cin>>dictionary[dictNum]&& strcmp(dictionary[dictNum],"#"))
//字典的输入
{
dictNum++;
//字典中单词的个数
}
while(cin>>word[wordNum]&& strcmp(word[wordNum],"#"))
//check单词输入
{
wordNum++;
//check单词的个数
}
int*result=new int [dictNum];
//符合条件单词在字典中,数组的下标
intpos;
int*dictLen=new int [dictNum];
//储存字典中每个单词的长度
intk;
inti,j;
intwordLen;
boolflag;
//判断字典中是否存在该单词
for(k=0;k
dictLen[k]=strlen(dictionary[k]);
for(i=0;i
{
wordLen=strlen(word[i]);
flag=false;
pos=0;
for(j=0;j
{
if(wordLen==dictLen[j])
//单词长度相等的情况
{
if(!strcmp(word[i],dictionary[j]))
{
flag=true;
break;
}
else
{
if(change(dictionary[j],word[i]))
{
result[pos]=j;
pos++;
}
}
}
if(wordLen==dictLen[j]-1)
{
if(add(dictionary[j],word[i]))
{
result[pos]=j;
pos++;
}
}
if(wordLen==dictLen[j]+1)
{
if(del(dictionary[j],word[i]))
{
result[pos]=j;
pos++;
}
}
}
if(flag)
cout<<word[i]<<"is correct"<<endl;
else
{
cout<<word[i]<<":";
for(k=0;k
cout<<dictionary[result[k]]<<'';
cout<<endl;
}
}
delete dictLen;
return 0;
}
bool change(char *dict,char *w)
{
intnum=0;
while(*w)
{
if(*w!=*dict)
{
num++;
if(num>1)
return false;
w++;
dict++;
}
else
{
w++;
dict++;
}
}
returntrue;
}
bool del(char *dict,char *w)
{
intnum=0;
while(*w)
{
if(*w!=*dict)
{
num++;
if(num>1)
returnfalse;
w++;
}
else
{
w++;
dict++;
}
}
return true;
}
bool add(char *dict,char*w)
{
int num=0;
while(*w)
{
if(*w!=*dict)
{
num++;
dict++;
if(num>1)
return false;
}
else
{
w++;
dict++;
}
}
return true;
}
字符串通过长度建立一个哈希,在对查找相似单词,巧妙利用长度,操作简单高效,没有传统的改变、增加和删除一个字母,然后重新匹配,而是领用字符串的长度相等和相差一,进行分析,比较不同就行。
题目代码
#include
<iostream>
#include
<cstring>