Skip to content

10. Regular Expression Matching

https://leetcode.com/problems/regular-expression-matching/

c++
class Solution {
public:
    bool isMatch(string s, string p) {
        int m = s.length();
        int n = p.length();
        vector<vector<bool>> dp(m + 1, vector<bool>(n + 1, false));

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

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

        return dp[m][n];
    }
};
go
func isMatch(s string, p string) bool {
  m := len(s)
  n := len(p)
  dp := make([][]bool, m+1)
  for i := 0; i <= m; i++ {
    dp[i] = make([]bool, n+1)
  }

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

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

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

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

  return dp[m][n]
};
py
class Solution(object):
    def isMatch(self, s, p):
        """
        :type s: str
        :type p: str
        :rtype: bool
        """
        m, n = len(s), len(p)
        dp = [[False for j in range(n + 1)] for i in range(m + 1)]
        dp[0][0] = True
        for j in range(2, n + 1):
            dp[i][j] = dp[i][j - 2] and p[j - 1] == '*'
        for j in range(1, n + 1):
            for i in range(1, m + 1):
                if p[j - 1] == '.' or p[j - 1] == s[i - 1]:
                    dp[i][j] = dp[i - 1][j - 1]
                elif p[j - 1] == '*':
                    dp[i][j] = dp[i - 1][j - 2] or (dp[i  -1][j] and (p[j - 2] == s[i - 1] or p[j - 2] == '.'))
        return dp[m][n]