假设有个词典库,内存的单词和其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;
}
}
}