leetcode

我的 leetcode 题解(JavaScript)


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];
};