bool isMatch(char* s, char* p) {
const char* star=NULL;
const char* ss=s;
while (*s){
//advancing both pointers when (both characters match) or ('?' found in pattern)
//note that *p will not advance beyond its length
if ((*p=='?')||(*p==*s)){s++;p++;continue;}
// * found in pattern, track index of *, only advancing pattern pointer
if (*p=='*'){star=p++; ss=s;continue;}
//current characters didn't match, last pattern pointer was *, current pattern pointer is not *
//only advancing pattern pointer
if (star){ p = star+1; s=++ss;continue;}
//current pattern pointer is not star, last patter pointer was not *
//characters do not match
return false;
}
//check for remaining characters in pattern
while (*p=='*'){p++;}
return !*p;
}
const isMatch = function (s, p) {
const m = s.length, n = p.length;
if (m > 0 && n === 0) {
return false;
}
let dp = new Array();
for (let i = 0; i <= m; i++) {
dp[i] = new Array();
for (let j = 0; j <= n; j++) {
dp[i][j] = false;
}
}
dp[0][0] = true;
for (let i = 0; i < n; i++) {
if (p[i] === '*' && dp[0][i]) {
dp[0][i + 1] = true;
}
}
for (let i = 0; i < m; i++) {
for (let j = 0; j < n; j++) {
if (p[j] === '?' || p[j] === s[i]) {
dp[i + 1][j + 1] = dp[i][j];
}
if (p[j] === '*') {
// if (p[j - 1] !== s[i] && p[j - 1] !== '.') {
// dp[i + 1][j + 1] = dp[i + 1][j - 1];
// } else {
// 依次为 'a*' === '' 'a*' === 'a' 'a*' === 'n * a'
// 其实在当前条件分支中已经判定了 'a*' === 'a' 的情况了 ,所以下面的第二个判断可以删掉
dp[i + 1][j + 1] = dp[i + 1][j] || dp[i + 1][j] || dp[i][j + 1];
// }
}
}
}
return dp[m][n];
};