POJ1035 Spell checker

题目来源:http://poj.org/problem?id=1035

题目大意:

  写一个拼写检查程序。给定一些字典里的单词和一些待检查的词。需要检查的词可能是以下几种情况:

  1. 是正确的词;

  2. 删除一个字母可以成为一个正确的词;

  3. 加入一个字母可以成为一个正确的词;

  4. 替换一个字母可以成为正确的词。

  写一个程序找出给定的词可能是字典中的哪个词。

输入:首先给出字典的所有单词。"#"结束。然后给出待查的词,"#"结束。

输出:首先输出给出的待查词,若词正确输出" is correct",否则,先输出一个冒号,然后输出可能对应的字典里的词,有多个时按在字典中出现的顺序输出。每个单词前有个空格隔开。


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

遍历暴力解决之..(对于长度明显无法对应的词略去不查)。

 1 //////////////////////////////////////////////////////////////////////////
 2 //        POJ1035 Spell checker
 3 //        Memory: 964K        Time: 313MS
 4 //        Language: C++        Result: Accepted
 5 //////////////////////////////////////////////////////////////////////////
 6 
 7 #include <iostream>
 8 #include <map>
 9 #include <set>
10 #include <list>
11 #include <string>
12 
13 using namespace std;
14 
15 map<string, int> dictionary;
16 set<size_t> lens;
17 bool comp(string a, string b) {
18     return (dictionary[a] - dictionary[b]) < 0 ? true : false;
19 }
20 
21 int main() {
22     string buff;
23     int index = 0;
24     while (cin >> buff && buff != "#") {
25         dictionary[buff] = ++index;
26         size_t length = buff.size();
27         lens.insert(length);
28     }
29     while (cin >> buff && buff != "#") {
30         size_t length = buff.size();
31         list<string> queue;
32         if (lens.find(length) != lens.end()) {
33             if (dictionary.find(buff) != dictionary.end()) {
34                 cout << buff << " is correct" << endl;
35                 continue;
36             }
37             for (char c = 'a'; c <= 'z'; ++c) {
38                 for (int i = 0; i < buff.size(); ++i) {
39                     string temp = buff;
40                     temp.replace(i, 1, 1, c);
41                     if (dictionary.find(temp) != dictionary.end()) {
42                         queue.push_back(temp);
43                     }
44                 }
45             }
46         }
47         if (lens.find(length - 1) != lens.end()) {
48             for (int i = 0; i < buff.size(); ++i) {
49                 string temp = buff;
50                 temp.erase(i, 1);
51                 if (dictionary.find(temp) != dictionary.end()) {
52                     queue.push_back(temp);
53                 }
54             }
55         }
56         if (lens.find(length + 1) != lens.end()) {
57             for (char c = 'a'; c <= 'z'; ++c) {
58                 for (int i = 0; i <= buff.size(); ++i) {
59                     string temp = buff;
60                     temp.insert(i, 1, c);
61                     if (dictionary.find(temp) != dictionary.end()) {
62                         queue.push_back(temp);
63                     }
64                 }
65             }
66         }
67         queue.unique();
68         queue.sort(comp);
69         cout << buff << ":";
70         for (list<string>::iterator it = queue.begin(); it != queue.end(); ++it) {
71             cout << " " << *it;
72         }
73         cout << endl;
74     }
75     system("pause");
76     return 0;
77 }
View Code
posted @ 2013-08-01 17:02  小菜刷题史  阅读(327)  评论(0编辑  收藏  举报