题目链接:http://poj.org/problem?id=1035
Description
Input
Output
Sample Input
i is has have be my more contest me too if award # me aware m contest hav oo or i fi mre #
Sample Output
me is correct aware: award m: i my me contest is correct hav: has have oo: too or: i is correct fi: i mre: more me
Source
题意:
输入一些单词作为字典,再输入一些单词查找:
1、 若某个单词能在字典中找到,则输出correct。
2、 若某个单词能通过 变换 或 删除 或 添加一个字符后,在字典中找得到,则输出这些单词,输出顺序根据 输入的字典的字典序。
3、 若某个单词无论操作与否都无法在字典中找得到,则输出空。
代码如下:
#include
#include
#include
#include
using namespace std;
typedef struct letter
{
int len;
char s[17];
} let;
let str[10017];
void Repl(char *s, char *ss)
{
int len = strlen(s);
int flag = 0;
int i = 0, j = 0;
while(i < len)
{
if(flag >= 2)
break;
if(s[i] == ss[j])
{
i++,j++;
}
else
{
i++,j++;
flag++;
}
}
if(flag < 2)
printf(" %s",s);
}
void Inse(char *s, char *ss)
{
int len = strlen(ss);
int flag = 0;
int i = 0, j = 0;
while(j < len)
{
if(flag >= 2)
break;
if(s[i] == ss[j])
{
i++,j++;
}
else
{
j++;
flag++;
}
}
if(flag < 2)
printf(" %s",s);
}
void Dele(char *s, char *ss)
{
int len = strlen(s);
int flag = 0;
int i = 0, j = 0;
while(i < len)
{
if(flag >= 2)
break;
if(s[i] == ss[j])
{
i++,j++;
}
else
{
i++;
flag++;
}
}
if(flag < 2)
printf(" %s",s);
}
int main()
{
char ss[17];
int k = 0;
while(~scanf("%s",str[k].s))
{
str[k].len = strlen(str[k].s);
if(str[k].s[0]=='#')
break;
k++;
}
while(~scanf("%s",ss))
{
if(ss[0] == '#')
break;
int len = strlen(ss);
int flag = 0;
for(int i = 0; i < k; i++)
{
if(!strcmp(ss,str[i].s))
{
printf("%s is correct\n",ss);
flag = 1;
break;
}
}
if(flag)
continue;
printf("%s:",ss);
for(int i = 0; i < k; i++)
{
if(len == str[i].len)
Repl(str[i].s,ss);
else if(len == str[i].len+1)
Inse(str[i].s,ss);
else if(len == str[i].len-1)
Dele(str[i].s,ss);
}
printf("\n");
}
return 0;
}