题意
题解
d p [ i ] [ j ] dp[i][j] dp[i][j] 代表字符模式 p p p 的区间 [ 0 , i − 1 ] [0,i-1] [0,i−1] 与字符串 s s s 的区间 [ 0 , j − 1 ] [0,j-1] [0,j−1] 匹配的结果, m a t c h ( a , b ) match(a,b) match(a,b) 判断字符是否匹配
d p [ i ] [ j ] = { i f ( p [ i − 1 ] ! = ′ ∗ ′ ) { d p [ i − 1 ] [ j − 1 ] m a t c h ( p [ i − 1 ] , s [ j − 1 ] ) f a l s e o t h e r w i s e e l s e { d p [ i − 1 ] [ j ] ∣ ∣ d p [ i ] [ j − 1 ] j > 0 d p [ i − 1 ] [ j ] o t h e r w i s e dp[i][j]=\begin{cases} if(p[i-1]!='*')&\begin{cases} dp[i-1][j-1] & match(p[i-1],s[j-1]) \\ false & otherwise \end{cases} \\ else &\begin{cases} dp[i-1][j]\ ||\ dp[i][j-1] & j>0 \\ dp[i-1][j] & otherwise \\ \end{cases} \end{cases} dp[i][j]=⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧if(p[i−1]!=′∗′)else{dp[i−1][j−1]falsematch(p[i−1],s[j−1])otherwise{dp[i−1][j] ∣∣ dp[i][j−1]dp[i−1][j]j>0otherwise
class Solution
{
public:
bool judge(char a, char b)
{
return a == '?' || a == b;
}
bool isMatch(string s, string p)
{
int n = p.length(), m = s.length();
vector<vector<bool>> dp(n + 1, vector<bool>(m + 1, 0));
dp[0][0] = 1;
for (int i = 1; i <= n; i++)
{
if (p[i - 1] != '*')
{
for (int j = 1; j <= m; j++)
{
dp[i][j] = judge(p[i - 1], s[j - 1]) ? dp[i - 1][j - 1] : 0;
}
}
else
{
for (int j = 0; j <= m; j++)
{
dp[i][j] = j == 0 ? dp[i - 1][j] : (dp[i - 1][j] || dp[i][j - 1]);
}
}
}
return dp[n][m];
}
};