您的位置:首页 > 其它

POJ 1035 Spell checker

2013-08-13 15:59 351 查看
简单的字符串查找题,暴力搜索就能过。

重点是细节,细节有没有!!!

爆搜差不多150毫秒,我建了一个长度哈希表,成了110毫秒。

下面是代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char dic[10005][18],s[20];
int cmp(const void *a,const void *b)
{
return *(int *)a-*(int *)b;
}
bool Change(int x)
{
int dif=0,i=0,y=strlen(s);  //dif记录s与dic中在相同位置出现不同字符的个数
while(i!=y)
{
if(dic[x][i]!= s[i])
{
dif++;
if(dif>1)
return false;
}
i++;
}
return true;
}
bool Del(int x)
{
int dif=0,i=0,j=0,y=strlen(s);  //dif记录s与dic中在对应位置出现不同字符的个数
while(i!=y)
{
if(s[i]!= dic[x][j])
{
j++;  //dic后移一位再匹配
dif++;
if(dif>1)
return false;
}
else
{
i++;
j++;
}
}
return true;
}
bool Add(int x)
{
int dif=0,i=0,j=0,y=strlen(dic[x]);  //dif记录s与dic中在对应位置出现不同字符的个数
while(j!=y)
{
if(s[i]!=dic[x][j])
{
i++;  //s后移一位再匹配
dif++;
if(dif>1)
return false;
}
else
{
i++;
j++;
}
}
return true;
}
int main()
{
int len[20][10005],head[20],i,j,k,n=0;
memset(len,0,sizeof(len));
memset(head,0,sizeof(head));
while(scanf("%s",dic
),dic
[0]!='#')
{
int l=strlen(dic
);
len[l][head[l]]=n;
head[l]++;
n++;
}
while(scanf("%s",s),s[0]!='#')
{
int l=strlen(s),x,flat=0,a[10005],cut=0;
for(i=0;i<head[l];i++)
{
flat=0;
x=len[l][i];
if(!strcmp(s,dic[x]))
{
flat=1;
break;
}
else if(Change(x))
{
a[cut]=x;
cut++;
}
}
if(flat)
{
printf("%s is correct\n",s);
}
else
{
for(i=0;i<head[l+1];i++)
{
x=len[l+1][i];
if(Del(x))
{
a[cut]=x;
cut++;
}
}
for(i=0;i<head[l-1];i++)
{
x=len[l-1][i];
if(Add(x))
{
a[cut]=x;
cut++;
}
}
qsort(a,cut,sizeof(a[0]),cmp);
printf("%s:",s);
for(i=0;i<cut;i++)
{
printf(" %s",dic[a[i]]);
}
printf("\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: