Spell checker(poj 1035)

时间:2024-10-29 10:06:32

题意:

    此题是一个字符串的问题,首先要给出一个字典,里面存储了数个单词。而后,给出一个单词,如果字典中存在,那么就输出correct,如果字典中没有,那么就要判断是不是这个单词有错误,错误有3种,第一种是单词种的一个字母写错了,就是和字典中的单词来说只有一个字母不同,第二种是单词多了一个字母,如果去掉该字母,则和字典中的某单词一致。第三种是单词少一个字母,如果添加上该字母,则和字典中的某单词一致。目的是输出这几种错误所对应的字典中的单词。
暴力求解超时!!!
#include<cstdio>
#include<iostream>
#include<cstring>
#define M 10010
#define N 15
using namespace std;
char ch[M][N],s[N];
int a[M];
int search(char *a,char *b)
{
int lena=strlen(a);
int lenb=strlen(b);
if(lena==lenb)
{
int flag=;
for(int i=;i<lena;i++)
if(a[i]!=b[i])
if(!flag) flag=;
else return ;
if(flag==)return ;
}
if(lena==lenb+)
{
int pa=,pb=,flag=;
while()
{
if(pa>=lena&&pb>=lenb)break;
if(a[pa]==b[pb])
{
pa++;
pb++;
}
else
if(!flag)
{
flag=;
pa++;
}
else return ;
}
if(flag==)return ;
}
if(lena==lenb-)
{
int pa=,pb=,flag=;
while()
{
if(pa>=lena&&pb>=lenb)break;
if(a[pa]==b[pb])
{
pa++;
pb++;
}
else
if(!flag)
{
flag=;
pb++;
}
else return ;
}
if(flag==)return ;
}
return ;
}
int main()
{
int n=;
while()
{
scanf("%s",ch[++n]);
if(ch[n][]=='#')
{
n--;
break;
}
}
while()
{
int flag=,cnt=;
scanf("%s",s);
if(s[]=='#')break;
printf("%s",s);
for(int i=;i<=n;i++)
{
if(strcmp(s,ch[i])==)
{
printf(" is correct\n");
flag=;
break;
}
else if(search(s,ch[i]))
a[++cnt]=i;
}
if(!flag)
{
printf(":");
for(int i=;i<=cnt;i++)
printf(" %s",ch[a[i]]);
printf("\n");
}
}
return ;
}