poj 1035 Spell Checker —— 字符串

本来这个题是用字典树等等神算法实现的……结果我直接暴搞的。。。先开始写的LCS,后来超时惨了……就在网上查……结果发现LCS完全没必要,只用写一个o(n)的判断就可以了……

#include<cstdio>
#include
<cstdlib>
#include
<cstring>
#include
<algorithm>

struct dict
{
char s[30];
int len;
};
dict d[
10010];

int judge(char a[],char b[])
{
int sum=0;
int pos=-1;
int size=strlen(b);
for(int i=0;i<size;i++)
{
++pos;
if(a[pos]!=b[i])
{
--pos,++sum;
if(sum>1)
return 0;
}
}
return 1;
}

int main(void)
{
int top=1;
while(scanf("%s",d[top].s)==1)
{
d[top].len
=strlen(d[top].s);
if(d[top].s[0]=='#')
{
top
--;
break;

}
top
++;
}
char st[30]={0};
while(scanf("%s",st)==1)
{
if(st[0]=='#')
break;
int i;
dict a[
10010];
memset(a,
0,sizeof(a));
int top2=1;
int flag=0;
for(i=1;i<=top;i++)
{
int temp=d[i].len;
// int temp2=lcs(st,i);
int temp3=strlen(st);
if(!(temp==temp3-1||temp==temp3||temp==temp3+1))
continue;
if(strcmp(d[i].s,st)==0)
{
flag
=1;
break;
}
else if(temp==temp3)
{
int f=0;
char ch1,ch2;
for(int p=0;p<=temp;p++)
{
ch1
=d[i].s[p];
d[i].s[p]
='0';
ch2
=st[p];
st[p]
='0';
if(strcmp(d[i].s,st)==0)
{
f
=1;
}
d[i].s[p]
=ch1;
st[p]
=ch2;
}
if(f)
{
strcpy(a[top2].s,d[i].s);
top2
++;
}
}
else
{
if(temp>temp3)
{
if(judge(st,d[i].s))
{
strcpy(a[top2].s,d[i].s);
top2
++;
}
}
else if(temp3>temp)
{
if(judge(d[i].s,st))
{
strcpy(a[top2].s,d[i].s);
top2
++;
}
}
}
}
if(flag)
{
printf(
"%s is correct\n",st);
}
else
{
top2
--;
printf(
"%s:",st);
for(i=1;i<=top2;i++)
{
printf(
" %s",a[i].s);
}
puts(
"");
}
memset(st,
0,sizeof(st));
}
}

  

你可能感兴趣的:(check)