LeetCode题目(Python实现):正则表达式匹配

题目

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

'.' 匹配任意单个字符
'*' 匹配零个或多个前面的那一个元素

所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。

说明:

  • s 可能为空,且只包含从 a-z 的小写字母。
  • p 可能为空,且只包含从 a-z 的小写字母,以及字符 .*

示例1 :

输入:
s = "aa"
p = "a"
输出: false
解释: "a" 无法匹配 "aa" 整个字符串。

示例2 :

输入:
s = "aa"
p = "a*"
输出: true
解释: 因为 '*' 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 'a'。因此,字符串 "aa" 可被视为 'a' 重复了一次。

示例3 :

输入:
s = "ab"
p = ".*"
输出: true
解释: ".*" 表示可匹配零个或多个('*')任意字符('.')。

示例4 :

输入:
s = "aab"
p = "c*a*b"
输出: true
解释: 因为 '*' 表示零个或多个,这里 'c'0, 'a' 被重复一次。因此可以匹配字符串 "aab"

示例5 :

输入:
s = "mississippi"
p = "mis*is*p*."
输出: false

暴力递归

算法实现

def isMatch(self, text, pattern) -> bool:
    if not pattern:
        return not text

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

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

执行结果

执行结果 : 通过
执行用时 : 1388 ms, 在所有 Python3 提交中击败了29.77%的用户
内存消耗 : 13.5 MB, 在所有 Python3 提交中击败了5.04%的用户
在这里插入图片描述

带备忘录的递归

算法实现

def isMatch2(self, text, pattern) -> bool:
    memo = dict()  # 备忘录

    def dp(i, j):
        if (i, j) in memo:
            return memo[(i, j)]
        if j == len(pattern):
            return i == len(text)

        first = i < len(text) and pattern[j] in {text[i], '.'}

        if j <= len(pattern) - 2 and pattern[j + 1] == '*':
            ans = dp(i, j + 2) or \
                  first and dp(i + 1, j)
        else:
            ans = first and dp(i + 1, j + 1)

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

    return dp(0, 0)

执行结果

在这里插入图片描述

小结

这个困难有点难。。。想了半天,做了半天没有做出来,本来以为能够不停改边界能够成功,但是没搞出来。

最后看了题解明白了是从递归入手的,虽然自己也想过这样做,但是没动手,看来需要加强一下对递归的练习,总觉得递归有点难得感觉,心理上就没克服,或者说没有真正理解其内涵吧。

发布了112 篇原创文章 · 获赞 10 · 访问量 2892

猜你喜欢

转载自blog.csdn.net/qq_45556599/article/details/104853877