POJ1035-Spell checker

来源:互联网 时间:1970-01-01

转载请注明出处:優YoU http://user.qzone.qq.com/289065406/blog/1309051410

 

大致题意:

输入一部字典,输入若干单词

1、  若某个单词能在字典中找到,则输出corret

2、  若某个单词能通过 变换删除添加一个字符后,在字典中找得到,则输出这些单词,输出顺序根据  输入的那部字典的字典序

3、  若某个单词无论操作与否都无法在字典中找得到,则输出空

 

解题思路:

没难度的字符串处理,1次AC

暴力吧!模拟吧!

 

基本思路就是逐个比较 待查单词 与 字典单词 的长度,当且仅当两者长度之差的绝对值<=1时才进行检查操作。

 

Source修正:

http://neerc.ifmo.ru/past/1998.html

 

 

 1 //Memory Time 
2 //456K 157MS
3
4 #include<iostream>
5 #include<string.h>
6 using namespace std;
7
8 char dict[10001][16];
9 char word[51][16];
10
11 int DictNum=0; //字典计数器
12 int WordNum=0; //单词计数器
13
14 void Input(void);
15 bool Change(char* word,char* dict); //检查字符串word能否通过变换得到dict
16 bool Del(char* word,char* dict); //检查字符串word能否通过删除得到dict
17 bool Add(char* word,char* dict); //检查字符串word能否通过添加得到dict
18
19 int main(void)
20 {
21 Input();
22
23 int* DictLen=new int[DictNum]; //记计算字典中各个单词的长度
24 for(int n=0;n<DictNum;n++)
25 DictLen[n]=strlen(dict[n]);
26
27 for(int i=0;i<WordNum;i++)
28 {
29 int* address=new int[DictNum]; //记录word[i]通过变化得到的单词在dict中的下标
30 int pa=0; //address指针
31
32 bool flag=false; //标记字典中是否含有单词word[i]
33 int len=strlen(word[i]);
34
35 for(int k=0;k<DictNum;k++) //遍历字典
36 {
37 if(DictLen[k]==len) //Change or Equal
38 {
39 if(!strcmp(word[i],dict[k]))
40 {
41 flag=true;
42 break;
43 }
44 else if(Change(word[i],dict[k]))
45 address[pa++]=k;
46 }
47 else if(len-DictLen[k]==1) //Delete
48 {
49 if(Del(word[i],dict[k]))
50 address[pa++]=k;
51 }
52 else if(DictLen[k]-len==1) //Add
53 {
54 if(Add(word[i],dict[k]))
55 address[pa++]=k;
56 }
57 }
58
59 /*Output*/
60
61 if(flag)
62 cout<<word[i]<<" is correct"<<endl;
63 else
64 {
65 cout<<word[i]<<": ";
66 for(int j=0;j<pa;j++)
67 cout<<dict[ address[j] ]<<' ';
68 cout<<endl;
69 }
70
71 delete address;
72 }
73 return 0;
74 }
75
76 void Input(void)
77 {
78 while(cin>>dict[DictNum] && dict[DictNum++][0]!='#');
79 while(cin>>word[WordNum] && word[WordNum++][0]!='#');
80
81 DictNum--; //剔除'#'
82 WordNum--;
83 return;
84 }
85
86 bool Change(char* word,char* dict) //WordLen==DictLen
87 {
88 int dif=0; //记录word与dict中在相同位置出现不同字符的个数
89
90 while(*word)
91 {
92 if(*(word++) != *(dict++))
93 {
94 dif++;
95 if(dif>1)
96 return false;
97 }
98 }
99 return true;
100 }
101
102 bool Del(char* word,char* dict) //WordLen==DictLen+1
103 {
104 int dif=0; //记录word与dict中在对应位置出现不同字符的个数
105
106 while(*word)
107 {
108 if(*word != *dict)
109 {
110 word++; //word后移一位再匹配
111 dif++;
112 if(dif>1)
113 return false;
114 }
115 else
116 {
117 word++;
118 dict++;
119 }
120 }
121 return true;
122 }
123
124 bool Add(char* word,char* dict) //WordLen==DictLen-1
125 {
126 int dif=0; //记录word与dict中在对应位置出现不同字符的个数
127
128 while(*dict)
129 {
130 if(*word != *dict)
131 {
132 dict++; //dict后移一位再匹配
133 dif++;
134 if(dif>1)
135 return false;
136 }
137 else
138 {
139 word++;
140 dict++;
141 }
142 }
143 return true;
144 }
我的所有ACM解题报告:http://user.qzone.qq.com/289065406/blog/1301632863我的CSDN:http://hi.csdn.net/invite.php?u=10114444&c=57929f66dd919f2b我的新浪微博:http://weibo.com/lyy289065406我的腾讯微博:http://t.qq.com/liao5422我的QQ空间:http://user.qzone.qq.com/289065406我的百度空间:http://hi.baidu.com/you289065406/home我的金山网盘:http://www.kuaipan.cn/register/?invite=evpga1


相关阅读:
Top