博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
1035-Spell checker(模糊匹配)
阅读量:5077 次
发布时间:2019-06-12

本文共 4566 字,大约阅读时间需要 15 分钟。

一,题意:

  给出一组字典的单词,以'#'结束,之后给出一组要执行模糊匹配的单词序列,以'#'结束
  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
2 #include
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

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

转载于:https://www.cnblogs.com/My-Sunshine/p/4938395.html

你可能感兴趣的文章
GIT: 不能在一个git repository中加入另外一个git repo
查看>>
Mybatis批量insert报错的解决办法【the right syntax to use near '' at line...】
查看>>
网络编辑器插件ckeditor+ckfinder配置
查看>>
Swift学习笔记(六)
查看>>
关于C#的继承结论
查看>>
Andrew Ng机器学习公开课笔记–Principal Components Analysis (PCA)
查看>>
MC新手入门(二十七)------数据类型、标识符、常量与变量
查看>>
s10_part3_django_basic.md
查看>>
php 中文乱码问题
查看>>
HDU1099---数学 | 思维
查看>>
51Nod 1067 Bash游戏 V2 | 博弈论 Bash
查看>>
(八)jdk8学习心得之Optional类
查看>>
java设计模式之前戏
查看>>
搜狗输入法用户体验评价
查看>>
个人课程总结
查看>>
linux传输文件命令: rz 和 sz
查看>>
JavaScript缓动函数浅谈
查看>>
MyBaits一对一的查询方法
查看>>
信息的表示和处理之整数表示
查看>>
【BZOJ4010】菜肴制作
查看>>