假设有个词典库,内存的单词和其ID号如下所示。。。

假设有个词典库,内存的单词和其ID号如下所示。编程实现,输入一个单词(不区分大小写):(1)如果该单词和库内的单词完全相同,则输出该单词的ID 号; 2)如果该单词和词库中的某个词错了一个母,则输出“单词错误, 您是否想输入:”后跟正确的单词; (3)其他情况输出,“库中没有该单词!”

字典库:
1000
face
1001
head
1002
hand
1003
nose
1004
ear
1005
kneel
1006
finger
1007
leg

整体思路为利用map存储,key为单词,value为ID,输入一个单词后,先进行长度的计算,匹配字典库是否有相同长度的单词,然后再依次对key值的单词一个一个字母进行匹配。满足条件返回值进行后续判断,详解见代码。

测试时使用while(true)不断输入发现例如输入fece时,虽然第一次会返回正确结果,但fece本身却似乎存进了map中,当进行一次错误的判断后,会将错误的单词算进去,但如果只执行一次的话(题目执行一次即可),该算法则可正常输出结果!

例:1.fece 会输出face
2.feee 会输出fece
3.eeee 会输出feee
希望有大佬能够解答

一些样例(可能不全面):
fece ----- face
finggr----finger
haad-----head hand
ear-----1004
arr-----无该单词

#include <iostream>
#include<map>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;

string judge(string str, map<string, int>mp) {//用来判断
	int count = 0, j = 0;//count负责错误单词个数,j负责index数组中可以输出的单词的下标
	string index[20] = {"0","0","0","0" ,"0","0","0","0" ,"0","0","0" ,"0","0","0","0" ,"0","0","0" ,"0","0"};//进行字符串的初始化,不知为何,统一初始化似乎不起作用,没有办法只能这样
	for (map<string, int>::iterator it = mp.begin(); it != mp.end(); it++, count = 0,j++) {//遍历map,每次对一个单词搜索完后,count重初始为0
		if (str.length() == it->first.length()) {//如果单词个数相同则进行匹配
			for (int i = 0; i < str.length(); i++) {//匹配每个字母
				if (str[i] != it->first[i]) {//若字母有不同则继续
					count++;//错误个数加1,
					if (count == 2) {//如果错误个数达到2个,则重新将改下标的string数组置为"0"并退出循环,已经不匹配了
						index[j] = "0";
						break;
					}
					else {//若错误个数不到2,则该下标先保存这个单词,继续循环
						index[j] = it->first;//保存map中的该单词
						continue;
					}
				}
				else if (str[i] == it->first[i]) continue;//若字母相同 继续循环
			}
		}
	}
	string seq;//此字符串负责拼接多个返回情况
	bool judge = false;//判断是否有返回值
	for (int i = 0; i <20; i++) {
		if (index[i] != "0"){
			seq += index[i]+" ";//遍历string数组,如果有满足的单词,则将其拼接到seq上,judge设为true,意为有满足条件的值
			judge = true;
		}
	}
	if(judge)//有满足条件的值,则返回该字符串
	return seq;
	else
	return "0";//不满足条件,则返回"0"
}

int main()
{
	map<string, int>mp;
	mp["face"] = 1000;
	mp["hand"] = 1002;
	mp["ear"] = 1004;
	mp["finger"] = 1006;
	mp["head"] = 1001;
	mp["nose"] = 1003;
	mp["kneel"] = 1005;
	mp["leg"] = 1007;
	string str;
	while (true) {
		cin >> str;
		//记住这个大小写转换的C++式子,需要调用算法库
		transform(str.begin(), str.end(), str.begin(), ::tolower);//防止输入大小写的问题
		if (mp[str]) {//如果匹配,则直接输出value对应的ID值
			cout << mp[str] << endl;
		}
		else if (judge(str, mp) != "0") {//满足一个单词错误的返回值
			cout << "单词错误,您是否想输入:" << judge(str, mp) << endl;
		}
		else {//不满足条件的返回值
			cout << "库中没有该单词" << endl;
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值