leetcode10正则表达式匹配

news2024/11/20 15:41:35

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] = 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 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.coloradmin.cn/o/1491536.html

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

相关文章

漫画手绘视频教程分享

下载地址: 漫画手绘教程: https://url83.ctfile.com/d/45573183-60305653-039aed?p7526 (访问密码: 7526)

Doris实战——银联商务实时数仓构建

目录 前言 一、应用场景 二、OLAP选型 三、实时数仓构建 四、实时数仓体系的建设与实践 4.1 数仓分层的合理规划 4.2 分桶分区策略的合理设置 4.3 多源数据迁移方案 4.4 全量与增量数据的同步 4.5 离线数据加工任务迁移 五、金融级数仓稳定性最佳实践 5.1 多租户资…

DQL语言学习(2024/3/5)one

1.基础查询: select 查询列表 from 表名; 查询列表可以是:①表中的字段、②常量值、③表达式、④函数 ①查询表中的单个字段,多个字段,所有字段 select *from 表名; ③查询表达式: select 100*98; ④…

pip 安装

1、下载pip安装包 pip PyPI-python 2.7的版本 2、解压安装包 在文件路径中输入cmd进行安装配置到第三步骤 3、用python setup.py install 进行命令行安装 显示如下为安装成功 4、安装成功后需要在环境变量进行配置pip的路径 C:\Python27\Scripts 5、测试pip安装是否成功

nginx 根据参数动态代理

一、问题描述 nginx反向代理配置一般都是配置静态地址,比如: server {listen 80;location / {proxy_pass http://myapp1;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}} 这个反向代理表示访问80端口跳转到 http://myapp1 …

03按键控制LED

上回讲到点亮一个LED     这次我们来实现用按键控制led 不带中断的方式 当然实例来源网络 加上自己整合 先熟悉流程 0.添加一个自己写的驱动库文件 为什么添加 笔者想的是一个项目工程希望能适应很多个应用场景需要什么直接在里面调用分装好的函数就行 1.如何添加文件以及…

C++ 快速排序快速选择OJ

目录 1、75. 颜色分类 2、912. 排序数组 3、 215. 数组中的第K个最大元素 4、LCR 159. 库存管理 III 1、75. 颜色分类 思路:利用快速排序思路,使用三指针分块进行优化。 [0,left]——小于key[left1,right-1]——等于key[right,nums.size()]——大于k…

Day 6.有名信号量(信号灯)、网络的相关概念和发端

有名信号量 1.创建: semget int semget(key_t key, int nsems, int semflg); 功能:创建一组信号量 参数:key:IPC对像的名字 nsems:信号量的数量 semflg:IPC_CREAT 返回值:成功返回信号量ID…

惠普 DsekJet GT 5810/5820常见问题及解决方法

1、HP DeskJet GT 5810/5820机器的屏幕出现“P”时,该如何操作? 当屏幕出现“P”时,放入A4纸,按住“进纸键”3秒即可,打印机会打印出一张校准页。 2、HP DeskJet GT 5810/5820机器的屏幕出现“A”时,该如何…

反射(重点)

1.反射的概述 Java给我们提供了一套API,使用这套API我们可以在运行时动态的获取指定对象所属的类,创建 运行时类的对象,调用指定的结构,(属性,方法)等 API: java.lang.Class:代表一个类 jav…

JSP实现数据传递与保存

1.HTML页面转换JSP页面 直接再HTML页面最顶端添加page指令,修改文件后缀名;反之; 2.JSP内置对象 对象 描述 request 每当客户端请求JSP页面时,JSP引擎会制造一个新的request对象来代表这个请求。 response 当服务器创建req…

keycloak-鉴权springboot

一、环境描述 keycloak鉴权springboot的方式,此处简单介绍,springboot官方也提供了demo https://github.com/keycloak/keycloak-quickstarts/tree/latest/spring/rest-authz-resource-server 以及文档说明 Securing Applications and Services Guide…

ruoyi-nbcio-plus的Vue3前端一些插件使用介绍(二)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址: http://122.227.135.243:9666 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码: https://gitee.com/nbach…

微信小程序自动化测试——微信小程序云测服务!

MiniTest 微信小程序云测服务是一套由微信测试团队自主研发,联合WeTest云真机能力,共同推出的微信小程序自动化测试服务。 服务基于云真机,支持开发者简单快捷地实现小程序智能化Monkey测试,录制回放,自定义测试和性能…

基于springboot+vue的医疗报销系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

YOLO算法改进Backbone系列之:RepViT

摘要:近年来,与轻量级卷积神经网络(cnn)相比,轻量级视觉变压器(ViTs)在资源受限的移动设备上表现出了更高的性能和更低的延迟。这种改进通常归功于多头自注意模块,它使模型能够学习全局表示。然而,轻量级vit和轻量级cn…

猫咪冻干的价格差别为什么那么大?价格实惠的主食冻干分享

随着养猫科学知识的普及,越来越多的铲屎官选择更符合猫咪饮食天性的主食冻干喂养。尽管有些铲屎官因价格犹豫,但像我这样的资深铲屎官深知其益处。尽管其价格稍高于烘焙粮和膨化粮,但主食冻干为猫咪健康带来的实际好处是无法估量的。 对于像我…

约课小程序有哪些功能

​约课小程序为教育机构、教师和学生提供了便捷的预约和管理服务,有效提升了教学效率和用户体验。在这篇文章中,我们将介绍约课小程序常见的功能,帮助教育机构更好地了解如何利用小程序来提升服务质量和管理效率。 1. **课程预约功能**&…

基于openKylin与RISC-V的MindSpore AI项目实践

项目目标: 在openKylin系统上安装和配置MindSpore框架。开发一个简单的图像分类模型,并在RISC-V平台上进行训练和推理。根据RISC-V的特性,对MindSpore框架进行必要的优化。 目录 项目目标: 训练模型 编写训练代码,设…

美易官方《盘前:美国股指期货温和走低》

美国股指期货在盘前交易中温和走低,市场情绪在美联储主席鲍威尔即将作证前显得谨慎。投资者对即将公布的证词内容充满期待,以寻求对美联储未来货币政策的更多线索。 鲍威尔即将在国会作证,这是市场关注的焦点事件之一。他的证词可能会对美元汇…