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

embedded/2024/10/20 17:15:16/

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.ppmy.cn/embedded/35956.html

相关文章

JVS物联网设备连接管理:支持手动与定时启停

通道连接的启停 功能说明 为了更灵活地管理设备连接&#xff0c;平台需要在设备连接的新增和编辑功能中增加启停策略的配置。支持手动启停和定时启停两种选项&#xff0c;以便根据实际需求对设备连接进行灵活的控制。 功能 手动启停&#xff1a; 用户可以选择手动启停作为…

如何在CentOS部署青龙面板并实现无公网IP远程访问本地面板

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

多国语言免费在线客服系统源码,网站在线客服系统,网页在线客服软件在线聊天通讯平台

详情介绍 多国语言免费在线客服系统源码,网站在线客服系统,网页在线客服软件在线聊天通讯平台 新款在线客服系统全开源无加密:多商户、国际化多语言、智能机器人、自动回复、语音聊天、 文件发送、系统强力防黑加固、不限坐席、国际外贸、超多功能 支持手机移动端和PC网页…

Unity ParticleSystem 入门

概述 在项目的制作过程成&#xff0c;一定少不了粒子系统的使用吧&#xff0c;如果你想在项目粒子效果&#xff0c;那这部分的内容一定不要错过喔&#xff01;我添加了理解和注释更好理解一点&#xff01; 这次的内容比较多&#xff0c;右侧有目录&#xff0c;可以帮助快速导…

数据仓库基础理论(学习笔记)

数据仓库基础理论 1.数据仓库概念 2.数据仓库为何而来 3.数据仓库主要特征 4.OLTP、OLAP系统 5.数据仓库与数据库的区别 6.数据仓库与数据集市的区别 7.数据仓库分层架构 7.1为什么要分层&#xff1f; 8.ETL、ELT

鸿蒙内核源码分析(事件控制篇) | 任务间多对多的同步方案

官方概述 先看官方对事件的描述. 事件&#xff08;Event&#xff09;是一种任务间通信的机制&#xff0c;可用于任务间的同步。 多任务环境下&#xff0c;任务之间往往需要同步操作&#xff0c;一个等待即是一个同步。事件可以提供一对多、多对多的同步操作。 一对多同步模型…

红黑树(RBTree)认识总结

一、认识红黑树 1.1 什么是红黑树&#xff1f; 红黑树是一种二叉搜索树&#xff0c;与普通搜索树不同的是&#xff0c;在每个节点上增加一个“颜色”变量 —— RED / BLACK 。 通过对各个节点颜色的限制&#xff0c;确保从 根 到 NIL &#xff0c;没有一条路径会比其他路径长出…

本地的git仓库和远程仓库

文章目录 1. 远程创建仓库2. 关联远程和本地代码3. 推送本地分支到远程 1. 远程创建仓库 2. 关联远程和本地代码 上面创建完后会得到一个git仓库的链接&#xff0c;有SSH或者http的 http://gitlab.xxxxx.local:18080/xxxxx/dvr_avm.git ssh://gitgitlab.xxxxx.local:10022/xx…