题意:
给你两个字符串:第一个字符串只包含小写大写字母
第二个字符串除了字母之外,还有'.'和'*',其中'.'可以当成任意一个字符,'*'表示前面那个字符可以重复若干次
当然也可以重复0次,例如a.*A可以是aaaA,可以是abbbbA等等,也可以是aA
问两个串能不能匹配(即第二个字符串某种情况下和第一个字符串一模一样)
因为长度只有2500,很好想到DP,dp[x][y]表示第二个字符串长度为x,第一个字符串长度为y能否完美匹配(1or0)
但是要注意的细节特别多,具体看代码
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int n, m, dp[2505][2505];
char str[2505], jud[2505];
int main(void)
{
int T, i, j;
scanf("%d", &T);
while(T--)
{
scanf("%s%s", str+1, jud+1);
memset(dp, 0, sizeof(dp));
n = strlen(str+1);
m = strlen(jud+1);
dp[0][0] = 1;
for(i=1;i<=m;i++)
{
if(jud[i]=='*' && i==2)
dp[i][0] = 1;
for(j=1;j<=n;j++)
{
if(jud[i]=='.')
dp[i][j] = dp[i-1][j-1];
else if(jud[i]!='*')
{
if(jud[i]==str[j])
dp[i][j] = dp[i-1][j-1];
}
else
{
dp[i][j] = max(dp[i-2][j], dp[i-1][j]);
if((dp[i-1][j-1]==1 || (dp[i][j-1]==1)) && str[j]==str[j-1] && (str[j]==jud[i-1] || jud[i-1]=='.'))
dp[i][j] = max(dp[i][j], max(dp[i][j-1], dp[i-1][j-1]));
}
}
}
if(dp[m][n]==1)
printf("yes\n");
else
printf("no\n");
}
return 0;
}