HDU 1483(Automatic Correction of Misspellings)

模拟题,将测试的单词依次和字典中的单词匹配,分为以下几种情况:

  1. 如果两者完全相同,则直接输出,进行下一组测试;
  2. 如果两者长度之差大于 1,则不可能匹配,继续匹配字典中下一个单词;
  3. 如果字典单词的长度大,则判断是否字典单词只比测试单词多一个字母,其余部分完全相同;
  4. 如果测试单词的长度大,则判断是否字典单词只比测试单词少一个字母,其余部分完全相同;
  5. 如果两者长度相同,则首先判断是否两者只有一个字母不同,其余部分完全相同;否则再判断是否两者只有两个相邻字母位置颠倒,其余部分完全相同;
  6. 如果字典中的所有单词和测试单词都无法匹配,则测试单词未知。

注意如果字典中存在和测试单词完全相同的单词,则必须输出正确单词,否则输出最前面的匹配单词。所以发现匹配单词后,还要继续搜索字典剩余部分。

#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;
}

继续加油。

发布了325 篇原创文章 · 获赞 1 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Intelligence1028/article/details/105594763