class Solution {
public:
bool isMatch(const char *s, const char *p) {
string S = s;
string P = p;
vector<vector<bool>> dp(1001, vector<bool> (1001, false));
dp[0][0] = true;
for(int i = 0; i < P.size(); i++) {
if(P[i] == '*')
dp[0][i + 1] = true;
else
break;
}
// 分两种情况
// 1. s[i]==p[j] || p[j]=='?',在这种情况下对比前一个字符
// 2. p[j] == '*',分两种情况讨论
// 1、使用'*':对比s[i-1]和p[j]
// 2、不使用'*',即‘*’和空字符形成对应:对比s[i]和p[j-1],只要两种情况有一种为TRUE,则当前结果为TRUE
for(int i = 0; i < S.size(); i++) {
for(int j = 0; j < P.size(); j++) {
if(S[i] == P[j] || P[j] == '?')
dp[i + 1][j + 1] = dp[i][j];
else if(P[j] == '*')
dp[i + 1][j + 1] = dp[i + 1][j] || dp[i][j + 1];
}
}
return dp[S.size()][P.size()];
}
};