leetcode 第10题 正则表达式匹配

275 阅读1分钟

题目:给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配

  • '.' 匹配任意单个字符
  • '*' 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。 leetcode题目链接

动态规划算法步骤:

  1. 定义状态
  2. 状态转移

我的JavaScript解法

/**
 * @param {string} s
 * @param {string} p
 * @return {boolean}
 */
var isMatch = function(s, p) {
  const m = s.length;
  const n = p.length;
  const dp = Array.from(Array(m+1), () => [].fill.call(new Array(n+1),false));

  dp[0][0] = true;
  for (let j = 1; j <n+1; j++) {
    if(p[j-1] =='*')
      dp[0][j] = dp[0][j-2]
  }

  for (let i = 1; i <m+1; i++) {
    for (let j = 1; j <n+1; j++) {
      if (s[i-1] == p[j-1] || p[j-1] == '.') {
        dp[i][j] = dp[i-1][j-1]
      } else if (p[j-1] == '*') {
        if (s[i-1] != p[j-2] && p[j-2] != '.') {
          dp[i][j] = dp[i][j-2]
        } else {
          dp[i][j] = dp[i][j-2] || dp[i-1][j]
        }      
      }
    }
  }
  return dp[m][n]   
};

解析: 用动态规划法,比较难于讲解,参考flix的讲解 复杂度分析:

  • 时间复杂度:O(mn+n)O(m*n+n)
  • 空间复杂度:O(mn)O(m*n)