当前位置: 首页 > article >正文

leetcode正则表达式匹配问题(困难)

1.题目描述
在这里插入图片描述
2.解题思路,这道题自己没做出来,看了官方的题解,感觉对自己来说确实是比较难想的。使用了动态规划的解决方案,这种方案看题解都不一定能看明白,不过有个评论画图讲解的非常明白。其实仔细看题解的话,会发现和之前做的最长回文差不多。也先是定义了一个二维数组,f[i][j],用来描述是否是字符串s中的前i个字符和匹配串中的前J个是否相同。这个相同的条件又取决于之前的数组的真真假假,从这里我们就能看出这是可以分解成为一个子问题的动态规划问题。这里附上官方的题解。我精简了一下。本人学习记录,如有侵权,联系作者删除。
在这里插入图片描述
在这里插入图片描述
不妨换个角度思考问题,字母+*代表的情况如下:
在这里插入图片描述
3.解题代码(官方题解)

class Solution:
    def isMatch(self, s: str, p: str) -> bool:
        m, n = len(s), len(p)

        def matches(i: int, j: int) -> bool:
            if i == 0:
                return False
            if p[j - 1] == '.':
                return True
            return s[i - 1] == p[j - 1]

        f = [[False] * (n + 1) for _ in range(m + 1)]
        f[0][0] = True
        for i in range(m + 1):
            for j in range(1, n + 1):
                if p[j - 1] == '*':
                    f[i][j] |= f[i][j - 2]
                    if matches(i, j - 1):
                        f[i][j] |= f[i - 1][j]
                else:
                    if matches(i, j):
                        f[i][j] |= f[i - 1][j - 1]
        return f[m][n]

学习记录用,有问题可以一块探讨。


http://www.kler.cn/a/227221.html

相关文章:

  • 和鲸科技与智谱AI达成合作,共建大模型生态基座
  • C++初阶:适合新手的手撕string类(模拟实现string类)
  • Java 正则匹配sql
  • c语言大小写转换
  • 同构异机迁移方案2_目标服务器仅安装数据库软件scp物理文件
  • 图论练习4
  • 查看自己电脑是arm还是x64(x86);linux操作系统识别
  • pip安装tf-gpu=2.4的bug解决方案
  • 水面漂浮物监测识别摄像机
  • 前端工程化之:webpack2-2(内置插件)
  • 【考研408】计算机网络笔记
  • 「Kafka」消费者篇
  • JSR303参数校验-SpringMVC
  • STM32单片机的C语言基础
  • 红日靶场1搭建渗透
  • Linux权限管理
  • C语言中大小写字母的转化
  • 抖音已揽收怎么退货?怎么取消订单?
  • uniapp开发一个交流社区小程序
  • CSS的复合选择器