Spell checker(poj 1035)
题意:
此题是一个字符串的问题,首先要给出一个字典,里面存储了数个单词。而后,给出一个单词,如果字典中存在,那么就输出correct,如果字典中没有,那么就要判断是不是这个单词有错误,错误有3种,第一种是单词种的一个字母写错了,就是和字典中的单词来说只有一个字母不同,第二种是单词多了一个字母,如果去掉该字母,则和字典中的某单词一致。第三种是单词少一个字母,如果添加上该字母,则和字典中的某单词一致。目的是输出这几种错误所对应的字典中的单词。
暴力求解超时!!!
#include<cstdio> #include<iostream> #include<cstring> #define M 10010 #define N 15 using namespace std; char ch[M][N],s[N]; int a[M]; int search(char *a,char *b) { int lena=strlen(a); int lenb=strlen(b); if(lena==lenb) { int flag=0; for(int i=0;i<lena;i++) if(a[i]!=b[i]) if(!flag) flag=1; else return 0; if(flag==1)return 1; } if(lena==lenb+1) { int pa=0,pb=0,flag=0; while(1) { if(pa>=lena&&pb>=lenb)break; if(a[pa]==b[pb]) { pa++; pb++; } else if(!flag) { flag=1; pa++; } else return 0; } if(flag==1)return 1; } if(lena==lenb-1) { int pa=0,pb=0,flag=0; while(1) { if(pa>=lena&&pb>=lenb)break; if(a[pa]==b[pb]) { pa++; pb++; } else if(!flag) { flag=1; pb++; } else return 0; } if(flag==1)return 1; } return 0; } int main() { int n=0; while(1) { scanf("%s",ch[++n]); if(ch[n][0]=='#') { n--; break; } } while(1) { int flag=0,cnt=0; scanf("%s",s); if(s[0]=='#')break; printf("%s",s); for(int i=1;i<=n;i++) { if(strcmp(s,ch[i])==0) { printf(" is correct\n"); flag=1; break; } else if(search(s,ch[i])) a[++cnt]=i; } if(!flag) { printf(":"); for(int i=1;i<=cnt;i++) printf(" %s",ch[a[i]]); printf("\n"); } } return 0; }