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