模拟题,将测试的单词依次和字典中的单词匹配,分为以下几种情况:
- 如果两者完全相同,则直接输出,进行下一组测试;
- 如果两者长度之差大于 1,则不可能匹配,继续匹配字典中下一个单词;
- 如果字典单词的长度大,则判断是否字典单词只比测试单词多一个字母,其余部分完全相同;
- 如果测试单词的长度大,则判断是否字典单词只比测试单词少一个字母,其余部分完全相同;
- 如果两者长度相同,则首先判断是否两者只有一个字母不同,其余部分完全相同;否则再判断是否两者只有两个相邻字母位置颠倒,其余部分完全相同;
- 如果字典中的所有单词和测试单词都无法匹配,则测试单词未知。
注意如果字典中存在和测试单词完全相同的单词,则必须输出正确单词,否则输出最前面的匹配单词。所以发现匹配单词后,还要继续搜索字典剩余部分。
#include <iostream>
#include <string>
using namespace std;
const int MAXN = 10005;
string dic[MAXN]; //字典
int n; //字典中单词的数量
string test; //测试的单词
//将测试的单词依次和字典中的单词匹配
void match()
{
string temp; //字典中最前面的和测试单词匹配的单词
bool flag = false; //是否已有匹配的单词
int lenT = test.size(); //测试的单词的长度
int i;
for (i = 0; i < n; i++)
{
int lenD = dic[i].size(); //当前字典单词的长度
if (lenD - lenT > 1 || lenT - lenD > 1) //两者长度之差大于1
continue;
if (dic[i] == test) //两者完全相同
{
cout << test << " is correct" << endl;
return;
}
if (lenD > lenT) //字典单词的长度大
{
int j = 0, k = 0;
while (j < lenD && k < lenT)
{
if (dic[i][j] == test[k])
{
++j;
++k;
}
else
{
++j;
}
}
if ((j == lenD || j == lenD - 1) && k == lenT)
{
if (flag == false)
{
flag = true;
temp = dic[i];
}
}
}
else if (lenD < lenT) //测试单词的长度大
{
int j = 0, k = 0;
while (j < lenD && k < lenT)
{
if (dic[i][j] == test[k])
{
++j;
++k;
}
else
{
++k;
}
}
if (j == lenD && (k == lenT || k == lenT - 1))
{
if (flag == false)
{
flag = true;
temp = dic[i];
}
}
}
else //两者长度相等
{
int num = 0;
int j = 0, k = 0;
while (j < lenD && k < lenT)
{
if (dic[i][j] != test[k])
{
++num;
}
++j;
++k;
}
if (num == 1)
{
if (flag == false)
{
flag = true;
temp = dic[i];
}
}
num = 0;
j = 0; k = 0;
while (j < lenD && k < lenT)
{
if (dic[i][j] == test[k])
{
++j;
++k;
}
else if (dic[i][j + 1] == test[k] && dic[i][j] == test[k + 1])
{
++num;
j += 2;
k += 2;
}
else
break;
}
if (j == lenD && k == lenT && num == 1)
{
if (flag == false)
{
flag = true;
temp = dic[i];
}
}
}
}
if(flag) //存在匹配的单词
cout << test << " is a misspelling of " << temp << endl;
else
cout << test << " is unknown" << endl;
}
int main()
{
while (cin >> n)
{
for (int i = 0; i < n; i++)
{
cin >> dic[i];
}
int q;
cin >> q;
while (q--)
{
cin >> test;
match();
}
}
return 0;
}
继续加油。