leetcode10正则表达式匹配

leetcode10正则表达式匹配

  • 思路
  • python

思路

难点1
如何理解特殊字符 ’ * ’ 的作用?
如何正确的利用特殊字符 ’ . ’ 和 ’ * ’ ?

'*' 匹配零个或多个前面的那一个元素
"a*" 可表示的字符为不同数目的 'a',包括:
""(0 个 'a')
"a"(1 个 'a')
"aa"(2 个 'a')
"aaa"(3 个 'a')

难点2
正则表达式匹配:一种在文本中查找特定模式的方法。
这道题的正则匹配规则主要是 ’ * '、 ’ . ’ 这两个特殊字符的使用。

如何利用现有数据结构 构造这个问题?
按照规则,(有顺序)从左到右来匹配一个字符串。
所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。

如果不考虑这两个特殊字符,我们可以用二维数组来动态的表示两个字符串是否匹配。只有前面的数组匹配上,后面的数组才可以继续匹配。
在这里插入图片描述
但现在要考虑 ’ * '、 ’ . ’ 这两个特殊字符。
p[j]= ‘.’,则 p[j]一定可以与 s[i]匹配成功,此时有dp[i][j]=dp[i−1][j−1]
p[j]= ‘*’,则表示可对 p[j]的前一个字符 p[j−1]匹配(或理解为复制)任意次(包括 0 次)。
在这里插入图片描述

匹配0次,意味着 p[j−1]和 p[j]不起作用,
相当于在 p 中删去了 p[j−1]和 p[j],
此时有:dp[i][j]=dp[i][j−2]

匹配 1次,意味着 p[j−1]和 p[j]组成了 1 个’a’,若 s[i−1+1, …, i]=p[j−1],
则 dp[i][j]可由 dp[i−1][j−2]转移而来,
此时有:dp[i][j]=dp[i−1][j−2],&s[i−1+1, …, i]=p[j−1]

匹配 k 次,意味着 p[j−1]和 p[j]组成了 k 个’a’,若 s[i−k+1, …, i]=p[j−1],
则 dp[i][j]可由 dp[i−k][j−2]转移而来,
此时有:dp[i][j]=dp[i−k][j−2],&s[i−k+1, …, i]=p[j−1]

在这里插入图片描述
难点3
状态转移的优化
总的来看,当 p[j]= '’ 时,对于匹配 0∼k次,我们有:
在这里插入图片描述
同时,对于 dp[i−1][j]我们有:
在这里插入图片描述
观察发现,(2)式与(1)式中的后 k 项刚好相差了一个条件 s[i]=p[j−1],将(2)式代入(1)式可得简化后的「状态转移方程」为:
p[j]= '
'时,简化后对应的状态更新过程如下图所示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

记 s 的长度为 m,p的长度为 n 。为便于状态更新,减少对边界的判断,初始二维 dpdpdp 数组维度为 (m+1)×(n+1),其中第一行和第一列的状态分别表示字符串 s 和 p 为空时的情况。

显然,dp[0][0]=True。对于其他 dp[0][j],当 p[j]≠p[j]='‘时,s[0,…,j]无法与空字符匹配,因此有 dp[0][j]=False;而当 p[j]=p[j]=p[j]=’'时,则有 dp[0][j]=dp[0][j−2]。

python

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] = Truefor 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 s[i-1] == p[j-1] or p[j-1] == '.':dp[i][j] = dp[i-1][j-1]elif p[j-1] == '*':     # 【题目保证'*'号不会是第一个字符,所以此处有j>=2if s[i-1] != p[j-2] and p[j-2] != '.':dp[i][j] = dp[i][j-2]else:dp[i][j] = dp[i][j-2] | dp[i-1][j]return dp[m][n]

在这里插入图片描述

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

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

相关文章

【大厂AI课学习笔记NO.65】机器学习框架和深度学习框架

笔记思维脑图已上传,访问我的主页可下载。 https://download.csdn.net/download/giszz/88868909 广义上,机器学习框架包含了深度学习框架。 本质上,机器学习框架涵盖分类、回归、聚类、异常检测和数据准备等各种学习方法。 深度学习框架涵…

SpringBoot启动扩展应用:干预优化+加快启动时间

一、SpringBoot启动配置原理简述 本内容直接查看分析SpringBoot启动配置原理,传送门: 二、SpringBoot启动过程干预 Spring Boot启动过程中我们可以实现以下干预工作: 修改Spring Boot默认的配置属性。使用ConfigurationProperties和Enable…

python celery beat实现定时任务

在Celery在python中的应用除了实现异步任务(async task)外也可以执行定时任务(beat) 1.Celery定时任务是什么? Celery默认任务单元由任务生产者触发,但有时可能需要其自动触发, 而beat进程正是负责此类任务,能够自动触发定时/周期性任务. 只需要在配置…

吴恩达deeplearning.ai:学习曲线决定下一步怎么做

以下内容有任何不理解可以翻看我之前的博客哦:吴恩达deeplearning.ai专栏 学习曲线是一种图形表示方法,用于展示模型在训练过程中的学习表现,即模型的训练集和验证集上的性能如何随着训练时间的增加而变化。可以帮助我们了解模型的学习进度。…

制作耳机壳的UV树脂和塑料材质哪一个成本更高一些?

总体来说,制作耳机壳的UV树脂的成本可能会略高于塑料材质。 原材料成本:UV树脂通常是通过复杂的合成过程制成的。这些过程不仅需要大量的能源投入,还需要较高水平的技术和设备支持,因此原材料成本较高。相比之下,塑料…

04-prometheus服务的动态发现

一、概述 目前,我们每增加一个被监控的节点,就需要修改prometheus的配置文件,然后重新加载prometheus服务,这种方式比较繁琐,每次新增、删除被监控节点都需要重新操作一遍,不适合生产环境的大规模监控架构&…

Go-zero中分布式事务的实现(DTM分布式事务管理器,在一个APi中如何调用两个不同服务的rpc层,并保证两个不同服务之间的业务逻辑同时成功)

涉及到的相关技术 1.DTM分布式事务管理器,解决跨数据库、跨服务、跨语言栈更新数据的一致性问题。 2.SAGA事务模式,SAGA事务模式是DTM中常用的一种模式,简单易上手.(当然还有其它更多的事务模式,这里采用的SAGA只不过是其中一种较为简单的方法) 3.Go-zero框架,ETCD服务注册... …

Windows 2012 设置 nginx 开机自启动(适用于windows2012/10)

Windows 2012 设置 nginx 开机自启动(适用于windows2012/10)https://www.cnblogs.com/xuegqcto/articles/7521483.html 在windows server 2012上安装nginx,同时配置开机自启动服务(推荐使用“Windows Service Wrapper”工具&…

【Linux】线程概念|线程理解|线程控制

文章目录 线程概念Linux中线程是否存在的讨论线程创建和线程控制线程的终止和等待(三种终止方式 pthread_join()的void**retval) 线程概念 线程就是进程内部的一个执行流,线程在进程内运行,线程在进程的地址空间内运行&#xff0…

LeetCode-第14题-最长公共前缀

1.题目描述 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。 2.样例描述 3.思路描述 按字符串数组每个数组的长度,将字符串数组从小到大排序;他们的公共前缀一定小于或等于最长元素长度…

2024年智能驾驶年度策略:自动驾驶开始由创造型行业转向工程型行业

感知模块技术路径已趋于收敛,自动驾驶从创造型行业迈向工程型行业。在特斯拉的引领下,国内主机厂2022年以来纷纷跟随特斯拉相继提出“重感知、轻地图”技术方案,全球自动驾驶行业感知模块技术路径从百花齐放开始走向收敛。我们认为主机厂智能…

2023.3.3周报

目录 摘要 一、文献阅读 1、题目 2、摘要 3、模型架构 4、文献解读 一、Introduction 二、实验 三、结论 二、PINN 一、PINN比传统数值方法有哪些优势 二、PINN方法 三、正问题与反问题 三、PINN实验 一、数学方程 二、模型搭建 总结 摘要 本周我阅读了一篇…

Postman上传文件的操作方法

前言 调用某个接口,测试上传文件功能。一时间不知如何上传文件,本文做个操作记录,期望与你有益。 步骤一、设置Headers key:Content-Type value:multipart/form-data 步骤二、设置Body 选择form-data key:file下拉框选择file类型value&…

STM32(8)NVIC编程

中断源由部分片上外设产生 在misc.h中找,杂项 配置NVIC GPIO和AFIO不能产生中断源,但能通过EXTI,由EXTI产生中断源 NVIC不需要开启时钟,因为NVIC模块位于内核内部,芯片一上电就能工作。 中断响应函数 中断向量表在启…

Java:JVM基础

文章目录 参考JVM内存区域程序计数器虚拟机栈本地方法栈堆方法区符号引用与直接引用运行时常量池字符串常量池直接内存 参考 JavaGuide JVM内存区域 程序计数器 程序计数器是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器,各线程…

Unity 常用的4种灯光、制作镜子、灯光的调用修改数值、

创建灯光时,一般用4种:定向光、点光源、聚光、区域光、 定向光:太阳 点光源:灯泡 聚光灯:手电筒 区域光:烘焙-贴图 灯光选择已烘焙 需要先选择被烘焙的物体,然后再选择Contribute GI 等待进…

java中的set

Set Set集合概述和特点 不可以存储重复元素 没有索引,不能使用普通for循环遍历 哈希值 哈希值简介 是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值 如何获取哈希值 Object类中的public int hashCode():返回对象的哈希码值。 哈希值的特点 同一个…

分布式ID生成算法|雪花算法 Snowflake | Go实现

写在前面 在分布式领域中,不可避免的需要生成一个全局唯一ID。而在近几年的发展中有许多分布式ID生成算法,比较经典的就是 Twitter 的雪花算法(Snowflake Algorithm)。当然国内也有美团的基于snowflake改进的Leaf算法。那么今天我们就来介绍一下雪花算法…

计算机视觉基础知识(二)---数字图像

像素 像素是分辨率的单位;构成位图图像的最基本单元;每个像素都有自己的颜色; 图像分辨率 单位英寸内的像素点数;单位为PPI(Pixels Per Inch),为像素每英寸;PPI表示每英寸对角线上所拥有的像素数目:,x:长度像素数目,y:宽度像素数目,Z:屏幕大小;屏幕尺寸(大小)指的是对角线长…

springer模板参考文献不显示

Spring期刊模板网站,我的问题是23年12月的版本 https://www.springernature.com/gp/authors/campaigns/latex-author-support/see-where-our-services-will-take-you/18782940 参考文献显示问好,在sn-article.tex文件中,这个sn-mathphys-num…