1035-Spell checker(模糊匹配)

一,题意:
  给出一组字典的单词,以‘#‘结束,之后给出一组要执行模糊匹配的单词序列,以‘#‘结束
  1,若某个单词能在字典中找到,则输出corret
  2,若某个单词能通过 变换 或 删除 或 添加一个字符后,在字典中找得到,则输出这些单词,输出顺序根据输入的那部字典的字典序
  3,若某个单词无论操作与否都无法在字典中找得到,则输出空
二,思路:
  暴力模拟。
  1,输入,以‘#‘结束
  2,判断字典的单词和被匹配的单词的长度
    i,如果word的长度等于dict的长度,则可能两个字符串匹配,也可能通过修改其中一个字符之后相匹配。
    ii,否则如果word的长度比dict的长度大 1 ,则判断通过删除一个字符后是否相匹配。
    iii,否则如果dict的长度等于word的长度大 1 ,则判断通过添加一个字符后是否相匹配。
  3,输出。
三,步骤:
  1,输入。
  2,判断:
    i,if strlen(word[])==strlen(dict[])
       if !strcmp(word[i], dict[j]) , 输出corret.
       else if 它们之间不同的字符个数 <= 1 , 则把单词的数组下标存入ans[]
    ii,else if strlen(word[])- strlen(dict[]) == 1
       if 它们之间不同的字符个数 <= 1 , 则 把单词的数组下标存入ans[]
    iii,else if strlen(dict[]) - strlen(word[] == 1
       if 它们之间不同的字符个数 <= 1 , 则 把单词的数组下标存入ans[]
3,输出。

  1 #include<iostream>
  2 #include<cstring>
  3 using namespace std;
  4
  5 char dict[10001][16];                                //存储字典
  6 char word[51][16];                                    //存储要匹配的单词
  7 int dictNum = 0;                                    //字典中单词的个数
  8 int wordNum = 0;                                    //要被匹配的单词的个数
  9 int dictLen[10001];                                    //存储每个单词的长度
 10 int ans[10001];                                        //存储每个单词在字典中的位置
 11
 12 //变换一个字符是否相同
 13 bool change(char word[], char dict[]) {
 14     int count = 0;
 15     for (int i = 0; i < strlen(word); i++) {
 16         if (word[i] != dict[i]) {
 17             count++;
 18             if (count > 1) {                        //不同的字母不超过1个
 19                 return false;
 20             }
 21         }
 22     }
 23     return true;
 24 }
 25
 26 //删除一个字符是否相同
 27 bool del(char word[], char dict[]) {
 28     int count = 0;
 29     for (int i = 0, j = 0; i < strlen(word); i++) {    //word的长度>dict的长度
 30         if (word[i] != dict[j]) {                    //如果不等于,word[]向后移一位
 31             count++;
 32             if (count > 1) {
 33                 return false;
 34             }
 35         }
 36         else {                                        //否则word[],dict[]都往后移一位
 37             j++;
 38         }
 39     }
 40     return true;
 41 }
 42
 43 //添加一个字符是否相同
 44 bool add(char word[], char dict[]) {
 45     int count = 0;
 46     for (int i = 0, j = 0; i < strlen(dict); j++) {    //dict的长度>word的长度
 47         if (word[i] != dict[j]) {                        //如果不等于,dict[]向后移一位
 48             count++;
 49             if (count > 1) {
 50                 return false;
 51             }
 52         }
 53         else {                                            //否则word[],dict[]都往后移一位
 54             i++;
 55         }
 56     }
 57     return true;
 58 }
 59
 60 //主要工作
 61 void work(char dict[][16], char word[][16]) {
 62     for (int i = 0; i < dictNum; i++) {
 63         dictLen[i] = strlen(dict[i]);
 64     }
 65     for (int i = 0; i < wordNum; i++) {
 66         memset(ans, 0, sizeof(ans));
 67         int len = strlen(word[i]);
 68         bool flag = false;                            //标记区分是第几种情况
 69         int k = 0;
 70         for (int j = 0; j < dictNum; j++) {
 71             if (dictLen[j] == len) {                //Change or Equal
 72                 if (!strcmp(word[i], dict[j])) {
 73                     flag = true;                    //若满足第一种情况,则为真
 74                     break;
 75                 }
 76                 else if (change(word[i], dict[j])) {
 77                     ans[k++] = j;                    //如果相同ans[]存储单词在字典中的位置
 78                 }
 79             }
 80             else if (len - dictLen[j] == 1) {        //Delete
 81                 if (del(word[i], dict[j])) {
 82                     ans[k++] = j;
 83                 }
 84             }
 85             else if (dictLen[j] - len == 1) {        //Add
 86                 if (add(word[i], dict[j])) {
 87                     ans[k++] = j;
 88                 }
 89             }
 90         }
 91         if (flag) {
 92             cout << word[i] << " is correct" << endl;
 93         }
 94         else {
 95             cout << word[i] << ": ";
 96             for (int j = 0; j < k; j++) {
 97                 cout << dict[ans[j]] << ‘ ‘;
 98             }
 99             cout << endl;
100         }
101     }
102 }
103
104 int main() {
105     //输入,以‘#‘结束
106     while (cin >> dict[dictNum] && dict[dictNum++][0] != ‘#‘);
107     while (cin >> word[wordNum] && word[wordNum++][0] != ‘#‘);
108     dictNum--;                                            //存储时,不存‘#‘
109     wordNum--;
110     work(dict, word);
111     return 0;
112 }

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-09 01:49:59

1035-Spell checker(模糊匹配)的相关文章

[ACM] POJ 1035 Spell checker (单词查找,删除替换增加任何一个字母)

Spell checker Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 18693   Accepted: 6844 Description You, as a member of a development team for a new spell checking program, are to write a module that will check the correctness of given word

POJ 1035 Spell checker (串)

题目大意: 问你后面输入的串能不能通过  加减一个字符,或者替换一个字符变成字典中的串. 思路分析: 直接模拟替换加减的过程. 比较两个串的长度.要相差为1 的时候才能进行模拟. 模拟的过程就是进行一个个的匹配. 发现失配的次数小于等于 1就可以输出. #include <cstdio> #include <iostream> #include <cstring> #include <algorithm> #include <string> #i

【POJ】1035 Spell checker

字典树. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <vector> 6 #include <string> 7 using namespace std; 8 9 typedef struct Trie { 10 int in; 11 Trie *next[26]; 12 } Trie;

[ACM] POJ 1035 Spell checker (单词查找,删除替换添加不论什么一个字母)

Spell checker Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 18693   Accepted: 6844 Description You, as a member of a development team for a new spell checking program, are to write a module that will check the correctness of given word

POJ 1035 Spell checker

题目链接 http://poj.org/problem?id=1035 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 24142   Accepted: 8794 Description You, as a member of a development team for a new spell checking program, are to write a module that will check the cor

poj 1035 Spell checker(暴力判断)

题目链接:http://poj.org/problem?id=1035 Description You, as a member of a development team for a new spell checking program, are to write a module that will check the correctness of given words using a known dictionary of all correct words in all their f

POJ 1035 Spell checker (模拟)

题目链接 Description You, as a member of a development team for a new spell checking program, are to write a module that will check the correctness of given words using a known dictionary of all correct words in all their forms. If the word is absent in

Spell checker POJ 1035 字符串

Spell checker Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 25426   Accepted: 9300 Description You, as a member of a development team for a new spell checking program, are to write a module that will check the correctness of given word

c2java 动态规划之模糊匹配

字符串匹配 精确: indexOf(String str); -- strstr(), O(mn). lastIndexOf(String str); -- continue 的别样用法. matches(String regex); -- Regex.compile()/match(). 模糊: java package? Spell Checker -- 两个字符串的相似程度 Fuzzy Finder -- 子列匹配 上面两个问题都可以用这个概念"编辑距离"来有效解决. 所谓这个距