题目大意:先输入一个词典(以#号结束),词典中的每个词条为一个字符串,然后有不定次询问(询问也以#号结束),每次询问是给出一个字符串c,问你在不在词典中,如果在,输出“c is correct”;如果不在,做下列3种操作:(1)改变c中的一个字符;(2)删除c中的一个字符;(3)在c中增加一个字符;如果c在完成以上操作后变成了词典中有的字符串,那么就把改变后的c输出,如果没有,原样输出c。其中,所有的字符串长度不超过15且都为小写字母。
分析:比较简单的字符串模拟题。字符串的长度都很小,暴力就OK。
用一个二维数组把词典纪录下来,同时纪录下来每个词条的长度,对于每一次询问,可以先遍历词典看c是否在词典中,如果在,直接输出,然后进行下一次询问。如果不在,那么对于这3种操作:操作(1)就是在长度和c相等的词条中,找出和c的对应位字符只有一个不等的词条输出即可;操作(2)和(3)其实就是判断在长度和c相差为1的词条中,两个字符串之间是否存在字串和母串的关系。
实现代码如下:
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
char dic[10010][20];
int len[10010];
int main()
{
char c[20];
int num=0,cnt;
bool flag;
while(cin>>c&&c[0]!='#')
{
strcpy(dic[num],c);
len[num++]=strlen(c);
}
while(cin>>c&&c[0]!='#')
{
flag=1;
for(int i=0;i<num;i++)
if(strcmp(dic[i],c)==0)
{
printf("%s is correct\n",c);
flag=0;
break;
}
if(!flag)
{
flag=1;
continue;
}
int lenc=strlen(c);
printf("%s:",c);
for(int i=0;i<num;i++)
{
if(lenc==len[i])
{
cnt=0;
for(int j=0;j<lenc;j++)
if(c[j]!=dic[i][j]) cnt++;
if(cnt==1) printf(" %s",dic[i]);
}
else if(lenc-len[i]==1)
{
cnt=0;
for(int j=0;j<lenc;j++)
if(c[j]==dic[i][cnt]) cnt++;
if(cnt==len[i]) printf(" %s",dic[i]);
}
else if(len[i]-lenc==1)
{
cnt=0;
for(int j=0;j<len[i];j++)
if(c[cnt]==dic[i][j]) cnt++;
if(cnt==lenc) printf(" %s",dic[i]);
}
}
printf("\n");
}
return 0;
}