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 }
版权声明:本文为博主原创文章,未经博主允许不得转载。