LeetCode 难题解析 —— 正则表达式匹配 (动态规划)

10. 正则表达式匹配

思路解析

这道题虽然看起来不难理解,但却存在多种可能,当然这种可能的数量是有限的,且其规律对于每一次判别都使用,所以自然而然就想到用 动态规划 的方法啦

接下来逐步分析可能的情况:

(s1 为 字符串 的字符数组(长度m),s2 为匹配规律的字符数组(长度n)

由于需要存储每次匹配是否成功的结果,所以需构造一个二维布尔数组,存放对应是否匹配成功

s2 的 每一个匹配字符有三种情况:正常字符、'.' 、'*', 所以可以以此分类

1. 如果s2[n-1] 是正常字符(不是'.' 或 ‘*’) , 则如果 s1[m-1] = s2[n-1], 这时如果前面都匹配成功,则该次也匹配成功,即取决于 s1[0...m-2] 和 s2[0...n-2]是否匹配,否则不能匹配。

2. 如果s2[n-1] 是 '.' 即可满足任意字符,则 s1[m-1] 一定和 '.' 匹配, 这时如果前面匹配成功,即

s1[0...m-2] 和 s2[0...n-2] 都匹配,则该次匹配成功。

3. 如果 s2[n-1] 是 '*' ,则s2[n-2]='x' 可以重复0次或多次,这时s2[n-2]和s2[n-1]为一个整体X,这时会出现两种情况,即s1[m-1] 是 0个字符'x',还是多个'x'中的最后一个

        i. 如果s1[m-1]是0个字符'x', 则s1[m-1]与s2的匹配规则整体X无关,这时只需看s1[0...m-1]      和  s2[0...n-3]是否匹配即可。

        ii. 如果s1[m-1]是多个'x'的最后一个, 则这时候s1[m-1]必须为'x' 或者 s2[n-2] 为’.' 任意字符, 满足该条件后能否匹配则看 s1[0...m-2] 和 s2[0....n-1] 是否匹配。

初始条件和边界情况:空串和空正则表达式匹配:f[0][0] = TRUE

代码详解

话不多说,上代码

class Solution {// 动态规划public boolean isMatch(String s, String p) {char[] s1 = s.toCharArray();char[] s2 = p.toCharArray();int m = s1.length;int n = s2.length;boolean[][] f = new boolean[m+1][n+1];for(int i = 0; i <= m; i++) {// 边界情况:空串和空正则表达式匹配f[i][0] = (i==0);for(int j = 1; j <= n; j++) {f[i][j] = false;// 不为'*'的情况: 则当s2[j-1]为任意字符'.' 或者s2[j-1]==s1[i-1]满足if(s2[j-1] != '*') {if(i > 0 && (s2[j-1]=='.' || s2[j-1]==s1[i-1])){// 按位或,若 f[i-1][j-1]为true,则f[i][j]为truef[i][j] |= f[i-1][j-1];}} else {// 为s2[j-1]'*'的情况: // 如果s1[i-1]为0个匹配字符, 那么f[i][j] 是否为true取决与 f[i][j-2], 即s1第i-1和s2第j-3比较if(j - 2 >= 0) {f[i][j] |= f[i][j-2];}// s2[j-2]=='.' 或者 s1[i-1]==s2[j-2] // 则 那么f[i][j] 是否为true取决与 f[i-1][j], 此时i必满足,所以看i-1if(i>0 && j -2 >= 0 && (s2[j-2]=='.' || s1[i-1]==s2[j-2])){f[i][j] |= f[i-1][j];}}}}return f[m][n];}
}

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

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

相关文章

栈(使用顺序表构建)

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 目录 1、栈的概念2、栈的数组构建方法2.1 前言2.2 正文2.2.1 栈的初始化2.2.2 栈的销毁2.2.3 压…

Jupyter notebook和 Jupyter lab内核死亡问题的原因和解决方案

写在前面&#xff1a;之前也遇到过几次内核死亡的问题&#xff0c;也一直没有想解决办法。这里总结一下并提出几个解决办法。 首先明确一下jupyter出现内核死亡的原因&#xff1a;jupyter lab 或者 jupyter notebook 本身是一个web服务&#xff0c; 无法支持高并发和频繁的计算…

栈与队列(包括例题一道)

栈 栈的概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端 称为栈顶&#xff0c;另一端称为栈底。 栈中的数据元素遵守后进先出 LIFO &#xff08; Last In First Out &#xff09;的原则。 压栈&…

libevent 梳理

C10K 背景 C10K问题&#xff1a;如何在一台物理机上同时服务 10000 个用户&#xff1f;这里 C 表示并发&#xff0c;10K 等于 10000&#xff1f; C10K 问题本质上是一个操作系统问题&#xff0c;需要考虑&#xff1a; 1.文件句柄数&#xff1a;每个客户连接都代表一个文件描述…

AI去衣技术在动画制作中的应用

随着科技的发展&#xff0c;人工智能&#xff08;AI&#xff09;已经在各个领域中发挥了重要作用&#xff0c;其中包括动画制作。在动画制作中&#xff0c;AI去衣技术是一个重要的工具&#xff0c;它可以帮助动画师们更加高效地完成工作。 AI去衣技术是一种基于人工智能的图像…

人际关系之【镜子、点到为止、脸色和蔼、懂自爱、弹性、试探】

人跟人是镜子 别人看到你的表情&#xff0c;当作一面镜子 儒家&#xff1a;先检查自己&#xff0c;容易进步 礼尚往来&#xff1a;一切往好处想&#xff0c;就会有好的结果 关于借钱&#xff1a; 没问题&#xff0c;我随时&#xff08;合适&#xff09;要用 个人和团体合在…

神经网络怎么把隐含层变量融合到损失函数中?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

【工具分享】Amnesia2勒索病毒解密工具

前言 Amnesia 勒索软件于 2017 年 4 月 26 日开始出现。Amnesia 主要通过 RDP&#xff08;远程桌面服务&#xff09;暴力攻击进行传播&#xff0c;允许恶意软件作者登录受害者的服务器并执行勒索行为。 特征 Amnesia 是一种用 Delphi 编程语言编写的勒索软件&#xff0c;它使…

Git撤回指定commit不保留更改

要撤销指定的commit但不保留这个commit中的更改&#xff0c;可以使用以下命令&#xff1a; git revert <commit_hash> --no-commit这里的<commit_hash>是你想要撤销的commit的哈希值。如果你想要在一个commit上使用这个命令&#xff0c;你可以用它的哈希值或者用H…

程序员的实用神器:助力软件开发的利器 ️

程序员的实用神器&#xff1a;助力软件开发的利器 &#x1f6e0;️ 程序员的实用神器&#xff1a;助力软件开发的利器 &#x1f6e0;️引言摘要自动化测试工具&#xff1a;保障代码质量的利剑 &#x1f5e1;️编写高效测试用例 持续集成/持续部署工具&#xff1a;加速交付的利器…

ASP.NET通用作业批改系统设计

摘  要 该系统采用B/S结构&#xff0c;以浏览器方式登陆系统&#xff0c;用ASP.NET作为开发语言&#xff0c;数据库则使用Microsoft SQL Server 2000实现。《通用作业批改系统》包括了学生子系统、教师子系统、管理员子系统三大模块&#xff0c;该系统主要完成学生&#xff…

基于C语言的贪吃蛇小游戏(简易版)

这篇博客会是对学习C语言成果的检测&#xff0c;为了实现贪吃蛇小游戏&#xff0c;我们用到的“工具”有&#xff1a;C语言函数、枚举、结构体、动态内存管理、预处理指令、链表、Win32 API等。 目录 1.简易版游戏效果 1.1欢迎界面 1.2游戏规则提示页面 1.3游戏进行页面 …

纯净水20、脉动30被指宰客!疯狂开始反噬小杨哥?

作为疯狂小杨哥早期粉&#xff0c;小柴好像很久没看到小杨哥的搞笑视频了。 自然&#xff0c;再在社交媒体上看到&#xff0c;小杨哥兄弟已经不再是那个青涩的少年了。 而是摇身一变不仅成为一个非常成功带货主播&#xff0c;且成为一个资本版图越来越多&#xff0c;玩的越来越…

现场面试题

这里写目录标题 1.sql1.1 只保留学生的最新成绩1.2 统计通话号码数1.3 更新地址 2.基础题2.1 请求序列第N位的值: 0, 1, 1, 2, ,3, 5, 8, 13, 21, 34.....第N位的值2.2 请写一段java代码&#xff0c;输出存在重复字母的单词 1.sql 1.1 只保留学生的最新成绩 表student中记录学…

CF988D题解

题目大意 题目传送门 题意&#xff1a;给你有 n n n 个数字的一个数列&#xff0c;问最多有多少个数字他们 两两的差是 2 的幂次方数。 思路 首先&#xff0c;我们想一个数能不能组成一个满足题目要求的序列&#xff0c;答案是肯定的。&#xff08;直接输出 a 1 a_1 a1​…

Android Studio之ImageView

ImageView是图像显示控件&#xff0c;与图形显示有关的属性说明如下: scaleType&#xff1a;指定图形的拉伸类型&#xff0c;默认是fitCenter。src&#xff1a;指定图形来源&#xff0c;src图形按照scaleType拉伸。 注意背景图不按scaleType指定的方式拉伸&#xff0c;背景默…

网络安全之交换基础

交换属于二层技术。路由器&#xff08;router&#xff09;是三层设备&#xff0c;可以基于IP地址转发&#xff0c;但需要路由表来记录。 交换机&#xff08;switch&#xff09;是二层设备&#xff0c;网桥&#xff08;switch&#xff09;也是二层设备&#xff0c;这两个都是基…

SegFix:预测边界和预测方向来修正边界

论文标题&#xff1a;SegFix: Model-Agnostic Boundary Refinement for Segmentation 论文地址&#xff1a;https://arxiv.org/pdf/2007.04269.pdf 代码地址&#xff1a;https://github.com/openseg-group/openseg.pytorch 两种loss监督 八种方向变回归问题为分类问题 代码地…

洛谷 P6136:【模板】普通平衡树(数据加强版) ← Splay树模板题

【题目来源】https://www.luogu.com.cn/problem/P6136【算法分析】 Splay 树简介及代码模板&#xff1a;https://blog.csdn.net/hnjzsyjyj/article/details/138504578【代码一&#xff1a;含 pushdown() 函数版本】 ● 本代码为洛谷 P6136 代码。题目来源为&#xff1a;https:…