一个简单题,先看字典中是否存在该传,如果不存在,就跟字典中字符串的长度比较,长度的绝对差大于1时,必定不是候选的答案串,长度相等时,看是否只有一个字符错误;长度不等时,看是否可以通过较长串删除一个字符得到较短串。
#include "stdio.h"
#include "string.h"
#include "math.h"
#include <string>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <algorithm>
#include <iostream>
using namespace std;
#define MAXM 1
#define MAXN 10005
#define max(a,b) a > b ? a : b
#define min(a,b) a < b ? a : b
#define abs(a) a < 0 ? a : (-a)
#define Mem(a,b) memset(a,b,sizeof(a))
int Mod = 1000000007;
double pi = acos(-1.0);
double eps = 1e-6;
char dic[MAXN][20];
typedef struct{
int f,t,w,next;
}Edge;
Edge edge[MAXM];
int head[MAXN];
int kNum;
void addEdge(int f, int t, int w)
{
edge[kNum].f = f;
edge[kNum].t = t;
edge[kNum].w = w;
edge[kNum].next = head[f];
head[f] = kNum ++;
}
char s[20];
void work( )
{
for(int i = 0; i < kNum; i ++){
if( strcmp(s, dic[i]) == 0 ){
printf("%s is correct\n",s);
return;
}
}
printf("%s:",s);
int len1 = strlen(s), len2;
for(int i = 0; i < kNum; i ++){
len2 = strlen(dic[i]);
if( len1 == len2 ){
int count = 0;
for(int j = 0; j < len1; j ++){
if( s[j] != dic[i][j] ){
count ++;
if( count > 1 ) break;
}
if( j == len1 - 1 )
printf(" %s",dic[i]);
}
}
else if( len1 - len2 == 1 ){
int j,k;
int count = 0;
for( j = 0, k = 0; j < len1; j ++){
if( s[j] != dic[i][k] ){
count ++;
if( count > 1 ) break;
}
else
k ++;
if( j == len1 - 1 )
printf(" %s", dic[i]);
}
}
else if( len2 - len1 == 1 ){
int j,k;
int count = 0;
for( j = 0, k = 0; j < len2; j ++){
if( dic[i][j] != s[k] ){
count ++;
if( count > 1 ) break;
}
else
k ++;
if( j == len2 - 1 )
printf(" %s", dic[i]);
}
}
}
printf("\n");
}
void solve()
{
kNum = 0;
if( strcmp(s,"#") == 0 ) return;
do{
getchar();
if( strcmp(s,"#") == 0 )
break;
strcpy(dic[kNum++],s);
}while(cin>>s);
while(cin>>s){
if( strcmp(s, "#") == 0 )
break;
work();
}
}
int main()
{
// freopen("d:\\test.txt", "r", stdin);
while(cin>>s){
solve();
}
return 0;
}