【题目链接】
http://acm.hdu.edu.cn/showproblem.php?pid=6170
题目意思
有两个字符串,问你第二个字符串和第一个字符串能否匹配,第二个字符串有两种符号,’.’可以匹配任意字符,’*’表示前一个字符可以重复零次或多次(0次也就是删除前一个字符)
解题思路
用dp[i][j]来表示b串第i个字符和前j个字符是否匹配。
当第i个字符为。时。由于‘。’可以匹配任意字符所以dp[i][j]=dp[i-1]
[j-1]。
当第i个字符为*
时。由于*
可以复制和删除所以分两种情况考虑。当复制0次和1次时:pd[i][j]=dp[i-2][j]|dp[i-1]j
当复制多次时:判断a[j]==a[j-1]?&&dp[i-1][j-1]和dp[i][j-1]是否匹配,如果都满足dp[i][j]也满足。
推荐个详细链接
代码部分
#include <bits/stdc++.h>
using namespace std;
const int maxn=2600;
char a[maxn],b[maxn];
bool dp[maxn][maxn];
int lena,lenb;
int main()
{
int T;
scanf("%d%*c",&T);
while(T--)
{
memset(dp,false,sizeof(dp));
a[0]=b[0]=1;
scanf("%s %s",a+1,b+1);
lena = strlen(a) - 1;
lenb = strlen(b) - 1;
dp[0][0]=true;
for(int i=1; i<=lenb; i++)
{
if(i>=2&&b[i]=='*')
dp[i][0] |= dp[i-2][0];
for(int j=1; j<=lena; j++)
{
if(b[i]=='.'||a[j]==b[i])
dp[i][j]=dp[i-1][j-1];
else if(b[i]=='*')
{
dp[i][j]=dp[i-2][j]|dp[i-1][j]; ///判断删减一个和不复制情况
if((dp[i-1][j-1]||dp[i][j-1])&&a[j-1]==a[j]) ///判断复制情况
dp[i][j] = true;
}
}
}
puts(dp[lenb][lena]?"yes":"no");
}
return 0;
}