#牛客春招刷题训练营# + 链接

dp[i][j]表示s串前i个字符跟p串前j个字符是否匹配,简单处理一下'*'字符和'?'字符。

比较坑的是s串前缀的'*'字符需要特殊考虑。

#include <bits/stdc++.h>
using namespace std;

const int MAXN=128;
char x[MAXN],y[MAXN];
bool dp[MAXN][MAXN];

bool ab(char c)
{
    return ('a'<=c && c<='z') || ('0'<=c && c<='9');
}

int main() {
    scanf("%s",(x+1));
    scanf("%s",(y+1));
    int n = strlen(x+1), m = strlen(y+1);
    for (int i=1;i<=n;i++) {
        if ('A'<=x[i] && x[i]<='Z') x[i] = x[i]-'A'+'a';
    }
    for (int j=1;j<=m;j++) {
        if ('A'<=y[j] && y[j]<='Z') y[j] = y[j]-'A'+'a';
    }
    dp[0][0] = 1;
    for (int i=1;i<=n && x[i]=='*';i++) {
        dp[i][0]=1;
    }
    for (int i=1;i<=n;i++) {
        for (int j=1;j<=m;j++) {
            if (x[i]=='*' && ab(y[j])) {
                dp[i][j]|=dp[i-1][j];
                dp[i][j]|=dp[i][j-1];
                dp[i][j]|=dp[i-1][j-1];
            }
            if (x[i]=='?' && ab(y[j])) {
                dp[i][j]|=dp[i-1][j-1];
            }
            if (x[i]==y[j]) {
                dp[i][j]|=dp[i-1][j-1];
            }
        }
    }
    if (dp[n][m]) puts("true");
    else puts("false");
    return 0;
}