| Time Limit: 2000MS | Memory Limit: 65536K | |
| Total Submissions: 18693 | Accepted: 6844 |
Description
Input
Output
Sample Input
i is has have be my more contest me too if award # me aware m contest hav oo or i fi mre #
Sample Output
me is correct aware: award m: i my me contest is correct hav: has have oo: too or: i is correct fi: i mre: more me
Source
输入词典中的单词,再输入需要查找的单词,查找到有四种方法:
1. 该单词存在词典中
2.该单词通过替换任何一个字母后存在于词典中(如果有多个,按词典序输出)
3.该单词通过删除任何一个字母后存在于词典中
4.该单词通过增加一个字母后存在于词典中
做本题遇到的问题:
char dic[ ] [ ] 存词典, char wor[] [] 存待查找的单词。
在判断单词是否能通过删除一个字母后存在于词典中时,因为函数传的是指针,而函数中又把字母的顺序移动了,这就造成把原单词给改变了,这个错误太致命了。。。其实判断上面说的后两种情况可以通过指针移动,判断不匹配的个数,单词的指针为i, 词典某个单词的指针为j , 当它们的字母相同时,i++,j++,不同时, 就让单词长度长的那个指针+1,mistake+1另一个不动,mistake的个数不能大于1,(因为判断的两个单词长度之差的绝对值不会大于1).
还有有个地方严重超时,下面代码:
bool replace(char *a,char *b)
{
string s1=a,s2=b;
int len1=s1.length();
int mistake=0;
for(int i=0;i<len1;i++)
if(s1[i]!=s2[i])
mistake++;
if(mistake==1)
return true;
return false;
}
直接操作就可以:
bool replace(char *a,char *b)//判断单词是否能替换掉一个字母而成为词典中的单词
{
int len1=strlen(a);
int mistake=0;
for(int i=0;i<len1;i++)
if(a[i]!=b[i])
{
mistake++;
if(mistake>1)
return false;
}
return true;
}#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
const int maxn=10010;
char dic[maxn][20];
char wor[60][20];
int dn,wn;//字典词的个数,需要查询的个数
bool correct(char *s1)//判断该单词是否存在于词典中
{
for(int i=1;i<=dn;i++)
if(strcmp(s1,dic[i])==0)
return true;
return false;
}
bool replace(char *a,char *b)//判断单词是否能替换掉一个字母而成为词典中的单词
{
int len1=strlen(a);
int mistake=0;
for(int i=0;i<len1;i++)
if(a[i]!=b[i])
{
mistake++;
if(mistake>1)
return false;
}
return true;
}
bool del(char *a,char *b)//判断单词是否能通过删除一个字母而成为词典中的单词
{
int len1=strlen(a);
int i=0,j=0;
int mistake=0;
while(i<len1)
{
if(a[i]!=b[j])
{
i++;
mistake++;
if(mistake>1)
return false;
}
else
{
i++;
j++;
}
}
return true;
}
int main()
{
dn=1;
wn=1;
while(cin>>dic[dn]&&dic[dn][0]!='#') dn++;
while(cin>>wor[wn]&&wor[wn][0]!='#') wn++;
dn--;wn--;
for(int i=1;i<=wn;i++)
{
if(correct(wor[i]))//首先去词典中查找有没有当前词
{
cout<<wor[i]<<" is correct"<<endl;
continue;
}
cout<<wor[i]<<": ";
for(int j=1;j<=dn;j++)
{
int len1=strlen(wor[i]);
int len2=strlen(dic[j]);
if(len1==len2)//长度相等
{
if(replace(wor[i],dic[j]))
cout<<dic[j]<<" ";
}
else if(len1-len2==1)//看单词是否删除一个字母后跟词典中匹配
{
if(del(wor[i],dic[j]))
cout<<dic[j]<<" ";
}
else if(len1-len2==-1)//增加一个字母后跟词典中匹配
{
if(del(dic[j],wor[i]))
cout<<dic[j]<<" ";
}
}
cout<<endl;
}
return 0;
}
[ACM] POJ 1035 Spell checker (单词查找,删除替换增加任何一个字母),布布扣,bubuko.com
[ACM] POJ 1035 Spell checker (单词查找,删除替换增加任何一个字母)
原文地址:http://blog.csdn.net/sr_19930829/article/details/37908431