LeetCode热题Hot100 - 正则表达式匹配

一刷~

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

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

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

有几个用例超时,容我三思。

目前的思路:递归判断是否满足匹配条件。

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

定睛一看s、p的长度都不超过20,想到用二维动态规划,果然过了,但是动态方程推导过程蛮坎坷的,两个小时过去了- -

 

class Solution:
    def isMatch(self, s: str, p: str) -> bool:
        m, n = len(s), len(p)
        dp = [[0]*(n+1) for i in range(m+1)]
        dp[0][0] = 1
        for i in range(1, n+1):
            if p[i-1] == "*":
                dp[0][i] = dp[0][i-2]
                
        for i in range(1, m+1):
            
            for j in range(1, n+1):
                if p[j-1] == "*":
                    if dp[i][j-2]:
                        dp[i][j] = 1
                        continue
                    if p[j-2] == ".":
                        if dp[i-1][j]:
                            dp[i][j] = 1
                    else:
                        if s[i-1] == p[j-2] and dp[i-1][j]:
                            dp[i][j] = 1
                elif p[j-1] == ".":
                    dp[i][j] = dp[i-1][j-1]
                else:
                    if s[i-1] == p[j-1]:
                        dp[i][j] = dp[i-1][j-1]
        return dp[m][n] == 1

相关推荐

  1. LeetCodeHot100 - 表达式匹配

    2024-04-03 06:16:03       32 阅读
  2. LeetCode-10. 表达式匹配

    2024-04-03 06:16:03       61 阅读
  3. leetCode算法—10. 表达式匹配

    2024-04-03 06:16:03       71 阅读
  4. LeetCode_10_困难_表达式匹配

    2024-04-03 06:16:03       67 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-03 06:16:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-03 06:16:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-03 06:16:03       82 阅读
  4. Python语言-面向对象

    2024-04-03 06:16:03       91 阅读

热门阅读

  1. 关于Mac配置逆向工程

    2024-04-03 06:16:03       35 阅读
  2. 力扣爆刷第110天之CodeTop100五连刷36-40

    2024-04-03 06:16:03       38 阅读
  3. uni-app选择多张图片上传并压缩——2024.04.02

    2024-04-03 06:16:03       35 阅读
  4. 前端|babel升级

    2024-04-03 06:16:03       34 阅读
  5. 【TypeScript系列】与其它构建工具整合

    2024-04-03 06:16:03       36 阅读
  6. GIN实例讲解

    2024-04-03 06:16:03       36 阅读
  7. centos7.9离线安装docker

    2024-04-03 06:16:03       39 阅读
  8. 安装gitlab笔记

    2024-04-03 06:16:03       36 阅读
  9. ASTM C1186-22 纤维水泥平板

    2024-04-03 06:16:03       36 阅读
  10. gitlab备份与恢复

    2024-04-03 06:16:03       37 阅读
  11. 【项目】牛马点评 问题汇总

    2024-04-03 06:16:03       34 阅读
  12. mysql 字段类型为json,后端用list接收

    2024-04-03 06:16:03       37 阅读