10. 正则表达式匹配

10. 正则表达式匹配

python 复制代码
class IsMatch:
    """
    10. 正则表达式匹配
    https://leetcode.cn/problems/regular-expression-matching/description/
    """
    def solution(self, s: str, p: str) -> bool:
        m, n = len(s), len(p)
        memo = [[-1] * n for _ in range(m)]
        return self.dp(s, 0, p, 0, memo)

    def dp(self, s: str, i: int, p: str, j: int, memo: list) -> bool:
        m, n = len(s), len(p)
        # base case 1
        # 模式串 p 匹配完了,那要看文本串 s 是否匹配完
        if j == n:
            return i == m

        # base case 2
        # 文本串 s 匹配完了,那模式串 p 一定是 字符 和 * 成对出现的
        if i == m:
            # 检查是否成对
            if (n - j) % 2 == 1:
                return False
            # 检查是否 x*y*z* 这种形式
            for k in range(j + 1, n, 2):
                if p[k] != '*':
                    return False
            return True

        # 备忘录
        if memo[i][j] != -1:
            return memo[i][j]

        res = False
        if s[i] == p[j] or p[j] == '.':
            if j < n - 1 and p[j + 1] == '*':
                # 通配符匹配0次
                res = self.dp(s, i, p, j + 2, memo) or \
                      self.dp(s, i + 1, p, j, memo)  # 通配符匹配多次
            else:
                # 常规匹配1次
                res = self.dp(s, i + 1, p, j + 1, memo)
        else:
            if j < n - 1 and p[j + 1] == '*':
                # 通配符匹配0次
                res = self.dp(s, i, p, j + 2, memo)
            else:
                # 无法继续匹配
                res = False

        memo[i][j] = res
        return res
相关推荐
小白快快跑哦3 天前
python-字符串全解(六):正则表达式-转义与非转义
python·正则表达式·转义与非转义
彧azz4 天前
算法设计与分析:贪心与动态规划
数据结构·学习·算法·贪心算法·动态规划
zx_741484814 天前
【Linux入门】Shell 函数、正则表达式与文本处理:cut 与 awk
linux·运维·正则表达式
Logic1016 天前
C语言/数据结构动态规划题解:Kadane算法求最大子数组和——O(n)时间O(1)空间
c语言·数据结构·动态规划·贪心·时间复杂度·算法题·最大子数组和
梦帮科技6 天前
AI 音乐产品的发布工程:验证门、数据发布、回滚与生产运维纪律
数据结构·数据库·架构·node.js·音视频·动态规划·推荐算法
语戚6 天前
力扣 1621. 大小为K的不重叠线段的数目:动态规划(Java 实现)
java·算法·leetcode·动态规划·力扣·dp
青山木6 天前
Hot 100 --- 最长有效括号
java·数据结构·算法·leetcode·动态规划
这料鬼有毒6 天前
二刷hot100-1143.最长公共子序列
算法·leetcode·动态规划
Tisfy7 天前
LeetCode 1477.找两个和为目标值且不重叠的子数组:滑动窗口 + 记录前值(动态规划)
动态规划·题解·dp·滑动窗口
Patrick在香港7 天前
Claude Prompt 香港场景:公文里「今日」落在 6 个日历日上,「翌日」锚错了 5 天
python·自然语言处理·正则表达式·claude·数据清洗