leetcode-10-正则表达式匹配

题目描述:

 

 

 

 

 

 回溯:

class Solution:
    def isMatch(self, s: str, p: str) -> bool:
        def helper(s,p):
            if not p:
                return not bool(s)
            if len(p)>=2 and p[1]=="*":
                if s and (p[0] == "." or p[0] == s[0]) :
                    return helper(s[1:],p) or helper(s,p[2:])
                else:
                    return helper(s,p[2:])
            else  :
                if s and (p[0] == "." or p[0] == s[0]) :
                    return helper(s[1:],p[1:])
            return False
        return helper(s,p)

官方:

class Solution(object):
    def isMatch(self, text, pattern):
        if not pattern:
            return not text

        first_match = bool(text) and pattern[0] in {text[0], '.'}

        if len(pattern) >= 2 and pattern[1] == '*':
            return (self.isMatch(text, pattern[2:]) or
                    first_match and self.isMatch(text[1:], pattern))
        else:
            return first_match and self.isMatch(text[1:], pattern[1:])

方法二:动态规划 O(TP)O(TP)

class Solution(object):
    def isMatch(self, text, pattern):
        memo = {}
        def dp(i, j):
            if (i, j) not in memo:
                if j == len(pattern):
                    ans = i == len(text)
                else:
                    first_match = i < len(text) and pattern[j] in {text[i], '.'}
                    if j+1 < len(pattern) and pattern[j+1] == '*':
                        ans = dp(i, j+2) or first_match and dp(i+1, j)
                    else:
                        ans = first_match and dp(i+1, j+1)

                memo[i, j] = ans
            return memo[i, j]

        return dp(0, 0)

另:自底向上 

class Solution(object):
    def isMatch(self, text, pattern):
        dp = [[False] * (len(pattern) + 1) for _ in range(len(text) + 1)]

        dp[-1][-1] = True
        for i in range(len(text), -1, -1):
            for j in range(len(pattern) - 1, -1, -1):
                first_match = i < len(text) and pattern[j] in {text[i], '.'}
                if j+1 < len(pattern) and pattern[j+1] == '*':
                    dp[i][j] = dp[i][j+2] or first_match and dp[i+1][j]
                else:
                    dp[i][j] = first_match and dp[i+1][j+1]

        return dp[0][0]

 

posted @ 2019-10-17 19:06  oldby  阅读(184)  评论(0编辑  收藏  举报