一直纠结.*在转移过程中可以被变为多个不同的字符,很郁闷...
写法一:
#include<bits/stdc++.h>
using namespace std;
#define N 2505
bool dp[N][N];
char s1[N], s2[N];
void solve()
{
cin >>s1+1>>s2+1;
int len1 = strlen(s1+1), len2 = strlen(s2+1);
memset(dp, 0, sizeof(dp));
dp[0][0]=true;
for(int i=1; i<=len2; i++)
{
if(s2[i]=='*'&&i==2) dp[2][0] = true;
for(int j=1; j<=len1; j++)
{
if(s2[i]=='.') dp[i][j] |= dp[i-1][j-1];
else if(s2[i] != '*')
{
if(s2[i]==s1[j]) dp[i][j] |= dp[i-1][j-1];
}
else
{
if(i>=2) dp[i][j]|=dp[i-2][j];
dp[i][j]|=dp[i-1][j];
if((dp[i-1][j-1]||dp[i][j-1])&&s1[j] == s1[j-1])
{
if(s2[i-1]==s1[j] && s2[i-1] != '.')
dp[i][j] = true;
else if(s2[i-1]=='.')
dp[i][j] = true;
}
}
}
}
if(dp[len2][len1]) puts("yes");
else puts("no");
}
int main()
{
int t;cin>>t;
while(t--)
{
solve();
}
return 0;
}
二:
#include<bits/stdc++.h>
using namespace std;
#define pii pair<int, int>
#define N 2501
bool dp[N][N];
char s1[N], s2[N];
void solve(int kase)
{
scanf("%s%s", s1+1, s2+1);
int len1=strlen(s1+1), len2=strlen(s2+1);
memset(dp, false, sizeof(dp));
dp[0][0] = true;
for(int i=1; i<=len2; i++)
{
if(s2[i] == '*') continue;
if((s2[i] >= 'a' && s2[i] <= 'z' || s2[i] >= 'A'&& s2[i] <= 'Z')&&i==len2)
{
for(int j=1; j<=len1; j++)
{
if(s2[i] != s1[j] || !dp[i-1][j-1]) continue;
dp[i][j] = true;
}
continue;
}
if(s2[i] == '.' && i==len2)
{
for(int j=1; j<=len1; j++)
{
if(!dp[i-1][j-1]) continue;
dp[i][j] = true;
}
continue;
}
if(s2[i] != '.' && (s2[i] >= 'a' && s2[i] <= 'z' || s2[i] >= 'A'&& s2[i] <= 'Z')&&s2[i+1] != '*')
{
for(int j=1; j<=len1; j++)
{
if(s2[i] != s1[j] || !dp[i-1][j-1]) continue;
dp[i][j] = true;
}
}
else if(s2[i] == '.' && s2[i+1] != '*')
{
for(int j = 1; j <=len1; j++)
{
if(!dp[i-1][j-1]) continue;
dp[i][j] = true;
}
}
else if((s2[i] >= 'a' && s2[i] <= 'z' || s2[i] >= 'A'&& s2[i] <= 'Z') && s2[i+1]=='*')
{
if(dp[i-1][0]) dp[i+1][0] = true;
for(int j = 1; j <= len1; j++)
{
if(dp[i-1][j]) dp[i+1][j] = true;
if(s2[i] == s1[j] && dp[i-1][j-1])
dp[i+1][j] = true;
if(s1[j] == s1[j-1] && s1[j-1] == s2[i]&&j>=2 && dp[i+1][j-1])
dp[i+1][j] = true;
}
}
else if(s2[i] == '.' && s2[i+1]=='*')
{
if(dp[i-1][0]) dp[i+1][0] = true;
for(int j = 1; j <= len1; j++)
{
if(dp[i-1][j]) dp[i+1][j] = true;
if(dp[i-1][j-1])
{
dp[i+1][j] = true;
}
if(s1[j]==s1[j-1]&&j>=2&&dp[i+1][j-1])
dp[i+1][j] = true;
}
}
}
if(dp[len2][len1]) puts("yes");
else puts("no");
}
int main()
{
int t, kase = 0;
scanf("%d", &t);
while(t--)
{
solve(kase++);
}
return 0;
}