POJ_1035_Spell checker(串)
题目挺简单,模拟一下就行。
题意:输入一个字典(可以用数组保存),用'#'代表输入结束。再输入一串字符,也是'#'结束。如果字典中有这个单词输出。。。is correct.如果字典中没有进行则输出可能的单词,如果连可能的单词也没有则输出原字符串就行不用输出查找的内容。
这里的可能的单词包括3种。1:可以增加一个字母在字典中找到。2:可以减少一个字母在字典中找到。3:当长度相等时可以改变一个字母在字典中找到。即分为三种情况分别来讨论就行。
注意:让你原样输出的内容
一点也不能变,不然会wr的。
1 # include <stdio.h> 2 # include <string.h> 3 # include <map> 4 struct node 5 { 6 char str[50]; 7 int len; 8 }ch[100000]; 9 int l; 10 int data[1000001]; 11 void Input() 12 { 13 int i; 14 for(i=0;;i++) 15 { 16 scanf("%s",ch[i].str); 17 ch[i].len=strlen(ch[i].str); 18 if(strcmp(ch[i].str,"#")==0) 19 break; 20 } 21 l=i; 22 } 23 int main() 24 { 25 int i,j,k; 26 char c[50]; 27 Input(); 28 while(scanf("%s",c) != EOF) 29 { 30 if(strcmp(c,"#") == 0) 31 break; 32 int flag=1; 33 for(i=0;i<l;i++) 34 { 35 if(strcmp(c,ch[i].str) == 0) 36 { 37 printf("%s is correct\n",c); 38 flag=0; 39 break; 40 } 41 } 42 int cnt=0; 43 if(flag) 44 { 45 printf("%s:",c); 46 int ll=strlen(c); 47 for(i=0;i<l;i++) 48 { 49 if(ll == ch[i].len) // change; 50 { 51 if(ll==1) 52 data[cnt++]=i; 53 else 54 { 55 int leag=0; 56 for(j=0;j<ll;j++) 57 { 58 if(c[j] != ch[i].str[j]) 59 leag++; 60 } 61 if(leag<=1) 62 data[cnt++]=i; 63 } 64 } 65 else if(ll+1 == ch[i].len)//delete; 66 { 67 int leag=0; 68 for(j=0,k=0;j<ch[i].len;j++) 69 { 70 if(ch[i].str[j] != c[k]) 71 leag++; 72 if(leag >=2) 73 break; 74 if(ch[i].str[j] == c[k]) 75 k++; 76 } 77 if(j == ch[i].len) 78 data[cnt++]=i; 79 } 80 else if(ll-1 == ch[i].len) 81 { 82 int leag=0; 83 for(j=0,k=0;j<ll;j++) 84 { 85 if(c[j] != ch[i].str[k]) 86 leag++; 87 if(leag>=2) 88 break; 89 if(c[j] == ch[i].str[k]) 90 k++; 91 } 92 if(j==ll) 93 data[cnt++]=i; 94 } 95 } 96 for(j=0;j<cnt;j++) 97 printf(" %s",ch[data[j]].str); 98 printf("\n"); 99 } 100 } 101 return 0; 102 }