pku 1035 Spell checker

额,这题,我好想看到分类说是用trie树,可是怎么想也没什么思路,就用了暴力了

若找不到相同的单词,则相似的也只有三种情况

代码很好理解

#include<iostream>
using namespace std;
#define MAXN 10001
char str[MAXN][20];
bool replace(char *a,char *b)
{
	int l1=strlen(a);
	int l2=strlen(b);
	if(l1==l2)//修改一个字符
	{
		int i=0;
		while(i<l1&&a[i]==b[i])//找到第一个不同的字符的位置
			i++;
		while(++i<l1)//看之后的字符是否相同
		{
			if(a[i]!=b[i])
				return false;
		}
	}
	else if(l1==l2+1)//添加一个字符的
	{
		int i=0;
		while(i<l2&&a[i]==b[i])
			i++;
		while(++i<l1)//a跳过一个字符与b比较
		{
			if(a[i]!=b[i-1])
				return false;
		}
	}
	else if(l1+1==l2)//删除一个字符,下面类似
	{
		int i=0;
		while(i<l1&&a[i]==b[i])
			i++;
		while(i++<l2)
		{
			if(a[i-1]!=b[i])
				return false ;
		}
	}
	else return false;
	return true;
}
int main()
{
	int i=0;
	bool flag;
	char c[20];
	while(scanf("%s",str[i++])!=EOF&&strcmp(str[i-1],"#")!=0);
	i--;
	while(scanf("%s",c)!=EOF && strcmp(c,"#")!=0)
	{
		flag=false;
		for(int j=0;j<i;j++)
			if(strcmp(str[j],c)==0)
			{
				flag=true;
				break;
			}
		if(flag)
			printf("%s is correct\n",c);
		else 
		{
			printf("%s:",c);
			for(int j=0;j<i;j++)
			{
				if(replace(str[j],c))
					printf(" %s",str[j]);
			}
		printf("\n");
		}
	}
	return 0;
}
posted @ 2011-05-15 20:41  枕边梦  阅读(172)  评论(0编辑  收藏  举报