开始想的是用字符串进行暴力匹配,也想到了dp,但是水平不够啊,写不出来状态转移方程,dp总会有规律,每个状态由前面的推出后面的,根据状态的不同,进行一些判断,总有一天我能自己写出稍微复杂的dp状态转移方程。
#include<bits/stdc++.h>
using namespace std;
#define pb push_back
bool dp[2505][2505];
char s1[2505],s2[2505];
int main()
{
//freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
int t;
scanf("%d%*c",&t);
while(t--)
{
gets(s1+1);
gets(s2+1);
memset(dp,0,sizeof(dp));
int len1=strlen(s1+1);
int len2=strlen(s2+1);
dp[0][0]=1;
for(int i=1; i<=len2; i++)
{
if(i==2&&s2[i]=='*')dp[i][0]=1;
for(int j=1; j<=len1; j++)
{
if(s2[i]=='.')dp[i][j]=dp[i-1][j-1];
else if (s2[i] == '*')
{
dp[i][j] = max(dp[i - 2][j], dp[i - 1][j]);
if (dp[i][j - 1] && s1[j] == s1[j - 1]) dp[i][j] = 1;
}
else
{
if (s2[i] == s1[j])
dp[i][j] = dp[i - 1][j - 1];
}
}
}
if(dp[len2][len1])printf("yes\n");
else printf("no\n");
}
return 0;
}