您的位置:首页 > 其它

poj1035 简单字符串匹配

2013-07-29 09:19 309 查看
大概说一下思路,首先,根据题目意思,可以知道,要比较的字符串 s 可以是 字典中一个字符串增加、删除一个字母得到,也可以是替换掉一个字母或者完全相同,
那么在将s查找的时候我们可以分两种情况,第一:和s字符串大小相差一的去看看是不是增加或删除了,第二:字符串相同的我们可以看看是替换了字母还是完全相同
思路就在代码中....暴力
#include<cstdio>
#include<string>
#include<iostream>
using namespace std;

string dir[10005],ans[10005];
int flag;

char ch[16];
string s;
void get_dir()//获得字典信息
{
	while(scanf("%s",ch))
	{
		s=ch;
		if(s =="#")
			break;
		else
		{//printf("%s\n",s.c_str());
			dir[flag++]=ch;
		}
	}
}

void check()
{
	int sum=0;//存放匹配的字符串个数
	ans[sum++]=s;//最开始存放我们要比较的字符串
	for(int i=0;i<flag;i++)
	{
		if(dir[i].size()==s.size()+1 || dir[i].size()==s.size()-1) //题目说可以是增加一个,删除一个,这里就考虑他们的大小只差是否为1
		{
			int diff=0;//记录不同之处
			int q=0,w=0;
			int flag=0;
			while(q<s.size()&&w<dir[i].size())
			{
				if(diff>1)break;
				if(s[q]==dir[i][w]) {q++;w++;}
				else if(s.size()>dir[i].size()) {diff++;q++;}//注意这个地方,可以想象,我们只需要把长的那个单词移动一位,
				else { diff++;w++;}                          //而不能移动短的,如果移动了短的,后面就根本没法比较啦
			}
			if(flag || diff>1) continue;
			else ans[sum++]=dir[i];
		}
		else if(dir[i].size()==s.size())//这里就是看大小相等的情况,是正确,还是可以有一个字母被替换
		{
			int flag1=0;
			if(dir[i]==s)
			{
				printf("%s is correct\n",s.c_str());
				return;
			}
			else
			{
				for(int p=0;p<s.size();p++)
					if(dir[i][p]!=s[p])
						flag1++;
			}
			if(flag1==1)
			{
				ans[sum++]=dir[i];
			}
		}
	}
	//结果输出,前提是在没有找到正确单词并return的情况下
	if(sum==1)
	{
		printf("%s:",ans[0].c_str());
	}
	else
		for(int g=0;g<sum;g++)
		{
			if(g==0){printf("%s:",ans[g].c_str());}
			else printf(" %s",ans[g].c_str());
		}
		
		printf("\n");
}

int main()
{
	flag=0;
	get_dir();
	while(scanf("%s",ch))
	{
		s=ch;
		if(s == "#")
			break;
		else
			check();
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: