码迷,mamicode.com
首页 > 其他好文 > 详细

1035-Spell checker(模糊匹配)

时间:2015-11-05 10:44:54      阅读:257      评论:0      收藏:0      [点我收藏+]

标签:

一,题意:
  给出一组字典的单词,以‘#‘结束,之后给出一组要执行模糊匹配的单词序列,以‘#‘结束
  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 }
View Code

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

1035-Spell checker(模糊匹配)

标签:

原文地址:http://www.cnblogs.com/My-Sunshine/p/4938395.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!