题意:对于给出的一些单词组成字典,然后对于每一个输入的单词检查,有以下几种情况:
1.这个单词在字典里有
2.这个单词删掉任意一个字母能在字典里有
3.这个单词插入任意一个字母能在字典里有
4.这个单词任意一个字母被替换在字典里有
这里可以用string,细心一点,10000个字典单词,50个查询单词,每个单词长度不超过15,那么可以对于每个查询单词暴力遍历判断一次
#include <iostream>
#include <string>
using namespace std;
string dic[10005];//字典
string ans[10005];//可能有的答案
int sum,ans_sum;//字典单词数,可能答案数
string str;//临时输入的字符串
void Imput()
{
sum = 0;
while(cin >> str)
{
if(str == "#") break;
dic[sum ++] = str;
}
}
void Print()
{
cout << str << ':';
for(int i = 0; i < ans_sum; i ++) cout << ' ' << ans[i];
cout<<endl;
}
void check()
{
while(cin >> str)
{
if(str == "#") break;
ans_sum = 0;
bool should_print = true;//是否要输出,这里对于 is correct 之后就不用后面的Print函数啦
for(int i = 0; i < sum; i ++)
{
if(str == dic[i]){
cout << str << " is correct" << endl;
should_print = false;
break;
}
else if(dic[i].length() == str.length()){ //长度相等,则可能有一个字母被替换
int flag = 0;
for(int j = 0; j < dic[i].length(); j ++)
{
if(dic[i][j] != str[j]) flag ++;
}
if(flag == 1)
ans[ans_sum ++] = dic[i];
}
else if(dic[i].length() - str.length() == 1){ //在str中插入一个字母,比较
int flag = 0;
for(int str_l = 0, dic_l = 0; str_l < str.length() && dic_l < dic[i].length(); )
{
if(str[str_l] == dic[i][dic_l]) str_l ++, dic_l ++;
else
{
dic_l ++;
flag ++;
}
}
if(!flag || flag == 1)
ans[ans_sum++] = dic[i];
}
else if(str.length() - dic[i].length() == 1){ //删除一个字母
int flag = 0;
for(int str_l = 0, dic_l = 0; str_l < str.length() && dic_l < dic[i].length(); )
{
if(str[str_l] == dic[i][dic_l]) str_l ++, dic_l ++;
else
{
str_l ++;
flag ++;
}
}
if(!flag || flag == 1)
ans[ans_sum++] = dic[i];
}
}
if(should_print) Print();
}
}
int main()
{
Imput();
check();
return 0;
}