您的位置:首页 > 其它

1197. Hotel (dp,字符串模糊匹配)

2012-03-18 18:31 260 查看
动态规划。实现模糊查找的功能,稍微修改最长公共子序列的状态转移方程即可实现此功能。

设 f [ i ][ j ] 表示第一个字符串的第 i 个字符前以及第二个字符串的第 j 个字符前的所有元素是否匹配

状态转移方程:

1) 若(key[i - 1] == word[j - 1] || key[i - 1] == '?') && f[i - 1][j - 1]

f [ i ][ j ] = true

2) 若key[i - 1] == '*' && f[i - 1][j - 1]

f [ i ][ k ] = true ( j - 1 <= k <= m, m是字符串word的长度 )

#include <iostream>
#include <cstring>
using namespace std;

char key[100],word[100];
bool dp[100][100];

bool check()
{
	memset(dp,0,sizeof(dp));
	int n=strlen(key);
	int m=strlen(word);
	dp[0][0]=1;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			if((key[i-1]==word[j-1]||key[i-1]=='?')&&dp[i-1][j-1])
				dp[i][j]=1;
			if(key[i-1]=='*'&&dp[i-1][j-1])
			{
				for(int k=j-1;k<=m;k++)
					dp[i][k]=1;
				break;
			}
		}
	}
	return dp
[m];
}
int main()
{
	int n;
	while(cin>>key)
	{
		cin>>n;
		int ans=0;
		while(n--)
		{
			cin>>word;
			if(check())
				ans++;
		}
		cout<<ans<<endl;
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: