poj 1035 Spell checker

http://poj.org/problem?id=1035 题目很简单,就是给一连串的字符串作为标准字符串,然后是输入以些变动的字符串,这个变动的字符串是这样定义的:

1.可能是随意的删掉了一个字符

2.可能是随意的加上了一个字符

3.与标准字符串相比,随意的替换掉了一个字符。

由于上面的定义都是说的一个,所以题目也就很简单了,只要罗列三种情况就可以,len1(母串)和len2(子串),1.len1==len2,   2.  len1-len2==1   3.  len2-len1==1;

虽然这样说简单,但是我写的时候也不觉得简单,主要是我对处理字符串不会,老是少考虑情况。好像写的代码也很复杂

  1 #include<stdio.h>
2 #include<string.h>
3 #include<iostream>
4 #include<algorithm>
5 using namespace std;
6 struct node
7 {
8 int len;
9 char str[20];
10 }a[10020];
11 int cmp(node a,node b)
12 {
13 return a.len<b.len;
14 }
15 int main()
16 {
17 int i,j,k;
18 i=0;
19 while(cin>>a[i].str,strcmp(a[i].str,"#"))
20 {
21 a[i].len=strlen(a[i].str);
22 i++;
23 }
24 //sort(a,a+i,cmp);
25 char sbr[20];
26 cin>>sbr;
27 while(strcmp(sbr,"#"))
28 {
29 int sum,mark=0;
30 sum=0;
31 int len1=strlen(sbr);
32 for(j=0;j<i;j++)
33 {
34 if(!strcmp(sbr,a[j].str))
35 {
36 mark=1;
37 cout<<sbr<<" is correct";
38 break;
39 }
40 }
41 if(!mark)
42 {for(j=0;j<i;j++)
43 {
44 //if(a[j].len-len1>1)break;
45 sum=0;
46 if(len1==a[j].len)
47 {
48 for(k=0;k<len1;k++)
49 if(a[j].str[k]!=sbr[k]) sum++;
50 //if(!sum) {cout<<sbr<<" is correct";mark=1;break;}
51 if(sum==1)
52 {
53 if(!mark)
54 {
55 mark=1;
56 cout<<sbr<<": "<<a[j].str;
57 }
58 else cout<<" "<<a[j].str;
59 }
60 }
61 sum=0;
62 if(len1-a[j].len==1)
63 {
64 for(k=0;k<len1;k++)
65 if(sbr[k]!=a[j].str[k]) break;
66 for(k=k+1;k<len1;k++)
67 if(sbr[k]!=a[j].str[k-1]) {sum=1;break;}
68 if(!sum)
69 {
70 if(!mark)
71 {
72 mark=1;
73 cout<<sbr<<": "<<a[j].str;
74 }
75 else cout<<" "<<a[j].str;
76 }
77 }
78 if(a[j].len-len1==1)
79 {
80 for(k=0;k<a[j].len;k++)
81 if(sbr[k]!=a[j].str[k]) break;
82 for(k=k+1;k<a[j].len;k++)
83 if(sbr[k-1]!=a[j].str[k]){sum=1;break;}
84 if(!sum)
85 {
86 if(!mark)
87 {
88 mark=1;
89 cout<<sbr<<": "<<a[j].str;
90 }
91 else cout<<" "<<a[j].str;
92 }
93 }
94 }
95 }
96 if(!mark) {cout<<sbr<<":";}
97 cout<<endl;
98 cin>>sbr;
99 }
100 return 0;
101 }

 

posted @ 2012-03-05 20:11  AC_Girl  阅读(185)  评论(0编辑  收藏  举报