LeetCode in Python 10. Regular Expression Matching (正则表达式匹配)

news2024/11/24 20:34:48

正则表达式匹配涉及到两个字符串的匹配问题,类似于寻找最大公共子串,可使用动态规划思想解决。重点和难点在于如何构建正确的状态转移方程。

示例:

图1 正则表达式匹配输入输出 

代码:

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

解释:

1)dp是一个储存是否可以匹配的状态矩阵,大小为(m + 1)*(n + 1),其中首行首列分别表示字符串s为空和字符串p为空的情况。其中dp[0][0]代表s,p两者均为空,显然能匹配。对于s为空而p不为空的情况(即对应dp的首行dp[0][j])是否能匹配取决于p中的字符,若为‘*’则可消除前一个字符使其为空,匹配成功。反之若不为‘*’,则无法匹配成功。故此需要初始化首行:

(ps:状态转移矩阵dp大小为(m + 1)*(n + 1),首行首列代表字符串为空的情况,故dp[i][j]对应s[i-1]和p[j-1])。

        m, n = len(s), len(p)

        dp = [[False] * (n + 1) for _ in range(m + 1)]

        dp[0][0] = True

        for j in range(1, n + 1):

                if p[j - 1] == '*':

                        dp[0][j] = dp[0][j - 2]

2)状态转移主要是判断p中的字符:

        若其为a-z的小写字母或字符‘.’,则直接与s中对应位置比较即可,若相同则dp[i][j] == dp[i - 1][j - 1],这里需要注意字符‘.’可匹配任意字符,可归为p[i][j]==s[i][i]这类情况。

        if p[j - 1] == s[i - 1] or p[j - 1] == '.':

                dp[i][j] = dp[i - 1][j - 1]

        若为字符‘*’,则需要考虑两种情况:

        1.字符'*'消除前一个字符,即p[j - 1] * 整体为空。出现此类情况是因为我们不想选择p[j - 1],即p[j - 1]与对应位置的s[i - 1]不相等(需要注意的是这里的p[j - 1]不等于s[i - 1]包含两种情况,一是两者均为小写字母且不等,二是p[j - 1]不为‘.’)

         2.字符‘*’复制一次前一个字符,即p[j - 1] *=p[j - 1]p[j - 1]。出现此种情况是因为p[j - 1]与对应位置的s[i - 1]相等。

         3.字符‘*’复制k次前一个字符,即p[j - 1] *=p[j - 1]...p[j - 1] (共k次)。出现此种情况是因为p[j - 1]与对应位置的s[i - k + 1]相等。

        elif p[j - 1] == '*':

                if p[j - 2] != s[i - 1] and p[j - 2] != '.':

                        dp[i][j] = dp[i][j - 2]

               else:

                       dp[i][j] = dp[i - 1][j] or dp[i][j - 2]

3)需要注意字符‘*’复制k次的情况,这里的k可以为0:

        dp[i][j] = dp[i - 1][j] or dp[i][j - 2]

另求助以下代码超时,大家能否帮笔者检查修改:

class Solution:
    def isMatch(self, s: str, p: str) -> bool:
        def dfs(i, j):
            if i >= len(s) and j >= len(p):
                return True
            if j >= len(p):
                return False
            
            match = i < len(s) and (s[i] == p[j] or p[j] == '.')
            if (j + 1) < len(p) and p[j + 1] == '*':
                return (dfs(i, j + 2) or (match and dfs(i + 1, j)))
            if match:
                return dfs(i + 1, j + 1)
            return False
        return dfs(0, 0) 
        

附上同样运用动态规划的最长公共子序列以及编辑距离的代码实现:

LeetCode in Python 300. Longest Increasing Subsequence (最长递增子序列)-CSDN博客

LeetCode in Python 72. Edit Distance (编辑距离)-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1634763.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二、再识VUE-MVVM

一、初识VUE 二、再识VUE-MVVM 三、VUE数据代理 MVVM Vue.js 专注于 MVVM 模型的 ViewModel 层。它通过双向数据绑定把 View 层和 Model 层连接了起来。实际的 DOM 封装和输出格式都被抽象为了 Directives 和 Filters。 ViewModel 一个同步 Model 和 View 的对象。在 Vue.js…

计算机复试项目:SpringCloud实战高并发微服务架构设计

秒杀购物商城--环境搭建 秒杀购物商城基础服务组件--详细介绍 秒杀购物商城基础服务--权限中心 秒杀购物商城业务服务--收货地址 秒杀购物商城业务服务--秒杀活动服务 秒杀购物商城--购物车的功能设计及分析 秒杀购物商城基础服务-用户中心 秒杀购物商城业务服务--商品中…

二分查找法实例

本文是根据数据结构中常常提到的二分法而作的一篇博客&#xff0c;主要通过一个二分法实例进行展开说明&#xff1a; 实例内容 通过一个二分法函数来寻找某个数是否在给定的数组中&#xff1b; 代码展示 # 执行二分查找法的算法函数 # 二分法查找的对象必须是一个有序的集…

初步认识Vscode

4.26初步认识Vscode &#xff08;一&#xff09;快捷键的使用 1. 打开控制端 ctrl ~2. 结束终端 ctrl c3. 多行同时对齐输出 按住shift alt 光标多选4. 多行同时任意位置输出 按住alt 光标单点你想要输入的位置5. 代码太长了&#xff0c;想混行编辑 alt z6. 打开设置控制…

工信部CAPPVD公布24年一季度积分情况,海云安位居全国第二!

近日&#xff0c;工业和信息化部移动互联网APP产品安全漏洞专业库&#xff08;以下简称“CAPPVD漏洞库”&#xff09;根据《CAPPVD漏洞库支撑单位能力评定办法》和综合24年第一季度的漏洞报送、重要行业企事业单位漏洞加分、高危漏洞处置加分、标准支撑等&#xff0c;最终公布了…

剧本杀小程序开发,剧本杀行业的新发展方向

前几年&#xff0c;剧本杀走入了大众的视野中&#xff0c;并迅速呈现出了井喷式的发展态势&#xff0c;一度成为了年轻消费者的首选娱乐方式&#xff0c;吸引了大量的消费者和跻身入局的创业者。 随着互联网的发展&#xff0c;剧本杀在线上的发展也非常火爆。我国网民群体非常…

final原理

文章目录 1. 设置 final 变量的原理2. 获取 final 变量的原理 1. 设置 final 变量的原理 理解了 volatile 原理&#xff0c;再对比 final 的实现就比较简单了 public class TestFinal {final int a 20; }字节码 0: aload_0 1: invokespecial #1 // Method java/lang/Object…

数据结构与算法(Java版) | 详解十大经典排序算法之一:插入排序

接下来&#xff0c;我来给大家讲解第三种排序算法&#xff0c;即插入排序。 基本介绍 首先&#xff0c;我们来看下插入排序的基本介绍。 插入排序&#xff0c;其属内部排序法&#xff0c;是对于欲排序的元素以插入的方式来找寻该元素的适当位置&#xff0c;以便最终达到排序…

解决RTC内核驱动的问题bm8563

常用pcf-8563 , 国产平替BM8563(驱动管脚一致)&#xff1b; 实时时钟是很常用的一个外设&#xff0c;通过实时时钟我们就可以知道年、月、日和时间等信息。 因此在需要记录时间的场合就需要实时时钟&#xff0c;可以使用专用的实时时钟芯片来完成此功能 RTC 设备驱动是一个标准…

最新版pycharm安装教程

目录 PyCharm 简介 访问 PyCharm 官网&#xff1a; 选择版本&#xff1a; 这里我们选择社区版即可 环境变量的配置 第一步 第二步 第三步 Pycharm的使用 【报错解决】 通用注意事项&#xff1a; PyCharm 简介 ​ PyCharm是一种Python IDE&#xff08;Integrated Devel…

Facebook的声音:听见社交媒体的心跳

社交媒体如今已经成为人们日常生活中不可或缺的一部分&#xff0c;而Facebook作为其中的佼佼者&#xff0c;承载着数以亿计的用户的交流、分享和连接。在这个信息爆炸的时代&#xff0c;Facebook的声音就像是社交媒体的心跳&#xff0c;传递着无数个体的情感、思想和生活。本文…

led台灯对眼睛好不好?分享多款高品质护眼台灯

很多家长都关心孩子学习时led台灯对眼睛好不好&#xff1f;其实&#xff0c;目前的led技术已经十分成熟了&#xff0c;一些好的led灯基本能够做到无蓝光、频闪危害等等&#xff0c;不过这也不包括一些劣质的产品&#xff0c;因为有些有些商家为了降低成本&#xff0c;不惜牺牲产…

Angular中的管道(Pipe)

Angular中的管道(Pipe) 文章目录 Angular中的管道(Pipe)前言一、内置管道1. date管道格式化日期2. currency管道格式化货币3. uppercase和lowercase管道转换字符串大小写4. 小数位数5. JavaScript 对象序列化6. slice7. 管道链 二、自定义管道 前言 Angular中的管道&#xff0…

CogVLM/CogAgent环境搭建推理测试

引子 对于多模态大语言模型&#xff0c;一直没有怎么接触。刚巧一朋友有问到这方面的问题&#xff0c;也就顺手调研下。智谱AI的东西一直以来&#xff0c;还是很不错的。ChatGLM的忠实fans&#xff0c;看到白嫖网站github上有他们开源的多模态CogVLM/CogAgent&#xff0c;那就…

Java项目:基于SSM框架实现的实践项目管理系统(ssm+B/S架构+源码+数据库+毕业论文+开题报告)

一、项目简介 本项目是一套基于SSM框架实现的实践项目管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff…

systemserver为啥很少同步跨进程调用app/DeadSystemException相关问题分析套路

背景&#xff1a; 有学员分享了一个问题&#xff0c;说monkey测试过程中有一系列问题属于同类的&#xff0c;具体看如下截图&#xff1a; 可以看到这里的有很多应用都进行了crash&#xff0c;而且crash原因居然都是写着 DeadSystemException: The system died; earlier logs …

《Redis使用手册之散列》

《Redis使用手册之散列》 **《Redis使用手册之散列》****散列简介****HSET&#xff1a;为字段设置值****HSETNX&#xff1a;只在字段不存在的情况下为它设置值****HGET&#xff1a;获取字段的值****HINCRBY&#xff1a;对字段存储的整数值执行加法或减法操作****HINCRBYFLOAT&a…

基于飞腾D2000全国产化高速公路一体化收费站解决方案:站数据服务器、站AI服务器、收费系统、监控系统

高速公路一体化收费站解决方案 行业 交通工程及沿路设施作为公路的一个重要组成部分&#xff0c;对城市互联和城市发展具有重要意义&#xff0c;因此围绕高速公路的专用收费 站设计和建设&#xff0c;将有效促进枢纽集散系统与高速公路连通&#xff0c;显著提升城市高速集散能…

Flexible布局在Web前端开发中的实际应用

随着Web前端技术的不断发展&#xff0c;Flexible布局&#xff08;弹性布局&#xff09;已成为现代网页设计中不可或缺的一部分。它提供了一种高效、灵活的方式来组织和管理页面元素&#xff0c;使开发者能够轻松应对各种复杂的布局需求。本文将通过一个实际的应用案例来介绍Fle…

echarts开发技巧

tooltip 提示框组件相关的行为&#xff0c;必须引入提示框组件后才能使用。 tooltip: {trigger: axis,axisPointer: {type: cross,label: {backgroundColor: #6a7985,},},//为弹出层的value值增加百分号valueFormatter: function (value) {return value %}, }, tooltip.axi…