【LeetCode笔记】剑指Offer 19. 正则表达式匹配(Java、动态规划)
文章目录
- 题目描述
- 思路 && 代码
- 二刷
打卡第十二天~
题目描述
- 拖了超级久的一道题= =,懒得看正则表达式,但是其实和正则表达式相关的地方也不多
思路 && 代码
- 参照这篇题解写的,dalao属实万物皆可动态规划。
- 主要是分情况(见代码注释的Case),主要是:
- 空正则(正则表达式为 “” )
- 非空正则:
a. 不是 ‘✳️’ 的情况
b. 是 ‘✳️’ 的情况:重复 0 次的情况 && 重复的情况
- |= 的考虑:2.a 和 2.b,只要满足其中一个即可
- ‘.'的考虑:在这个代码里,实际上只是相当于一个万用符
- 建议还是得动手画一遍表格来填,帮助理解。
class Solution {public boolean isMatch(String s, String p) {// init int m = s.length();int n = p.length();char[] arr1 = s.toCharArray();char[] arr2 = p.toCharArray();// dp[i][j] 代表 s 的前 i 个和 p 的前 j 个能否匹配boolean[][] dp = new boolean[m + 1][n + 1];// dp 过程for(int i = 0; i <= m; i++) {for(int j = 0; j <= n; j++) {// Case 1: 空正则if(j == 0) {dp[i][j] = (i == 0);}// Case 2: 非空正则else {// Case 2.1:不是'*'if(arr2[j - 1] != '*') {// 相等 or 为'.'的情况,直接看左上角的最优子结构if(i > 0 && (arr1[i - 1] == arr2[j - 1] || arr2[j - 1] == '.')) {dp[i][j] = dp[i - 1][j - 1];}}// Case 2.2:是'*'(最重要的部分)else {// Case 2.2.1:不看if(j >= 2) {// 重复0次,相当于直接砍掉最后两个字符dp[i][j] = dp[i][j - 2];}// Case 2.2.2:看if(i >= 1 && j >= 2 && (arr1[i - 1] == arr2[j - 2] || arr2[j - 2] == '.')) {// 多重复一次,和 s 串前移一位的结果一样// 为什么 |= ,相当于判断两次,只要有一次 true 就算 truedp[i][j] |= dp[i - 1][j];}}}}}return dp[m][n];}
}
二刷
- 倒没想象中那么恶心了,主要还是分好情况,然后再考虑如何dp
- 注意状态转移方程用到的最优子结构。
class Solution {public boolean isMatch(String s, String p) {boolean[][] dp = new boolean[s.length() + 1][p.length() + 1];for(int i = 0; i <= s.length(); i++) {for(int j = 0; j <= p.length(); j++) {if(j == 0) {dp[i][j] = (i == 0);continue;}// Case 1: 没碰到 * 的情况if(p.charAt(j - 1) != '*') {if(i > 0 && (s.charAt(i - 1) == p.charAt(j - 1) || p.charAt(j - 1) == '.')) {dp[i][j] = dp[i - 1][j - 1];}}// Case 2: 碰到 * 的情况else {// Case 2.1:不用 * if(j >= 2) {dp[i][j] = dp[i][j - 2];}// Case 2.2:用 *if(i >= 1 && j >= 2 && (s.charAt(i - 1) == p.charAt(j - 2) || p.charAt(j - 2) == '.')) {// 重复了一次,说明可以套用上一个 i 的结果。dp[i][j] |= dp[i - 1][j];}}}}return dp[s.length()][p.length()];}
}
【LeetCode笔记】剑指Offer 19. 正则表达式匹配(Java、动态规划)相关推荐
- 【LeetCode】剑指 Offer 19. 正则表达式匹配
[LeetCode]剑指 Offer 19. 正则表达式匹配 文章目录 [LeetCode]剑指 Offer 19. 正则表达式匹配 package offer;public class Soluti ...
- 剑指 Offer 19. 正则表达式匹配 regex_match() regex()
一. 题目: 剑指 Offer 19. 正则表达式匹配 请实现一个函数用来匹配包含'. '和''的正则表达式.模式中的字符'.'表示任意一个字符,而''表示它前面的字符可以出现任意次(含0次).在本题 ...
- 剑指 Offer 19. 正则表达式匹配
剑指 Offer 19. 正则表达式匹配 https://leetcode-cn.com/problems/zheng-ze-biao-da-shi-pi-pei-lcof/ 请实现一个函数用来匹配包 ...
- 【leetcode】 剑指 Offer学习计划(java版本含注释)(上)
目录 前言 第一天(栈与队列) 剑指 Offer 09. 用两个栈实现队列(简单) 剑指 Offer 30. 包含min函数的栈(简单) 第二天(链表) 剑指 Offer 06. 从尾到头打印链表(简 ...
- 剑指offer:正则表达式匹配
题目描述 请实现一个函数用来匹配包括'.'和''的正则表达式.模式中的字符'.'表示任意一个字符,而''表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式.例 ...
- 剑指offer之正则表达式匹配
题目 请实现一个函数用来匹配包括.和*的正则表达式.模式中的字符.表示任意一个字符,而*表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式.例如,字符串aaa ...
- 【LeetCode】剑指 Offer 04. 二维数组中的查找
[LeetCode]剑指 Offer 04. 二维数组中的查找 文章目录 [LeetCode]剑指 Offer 04. 二维数组中的查找 package offer;public class Solu ...
- 《LeetCode力扣练习》剑指 Offer 24. 反转链表 Java
<LeetCode力扣练习>剑指 Offer 24. 反转链表 Java 一.资源 题目: 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点. 示例: 输入: 1-& ...
- 《LeetCode力扣练习》剑指 Offer 05. 替换空格 Java
<LeetCode力扣练习>剑指 Offer 05. 替换空格 Java 一.资源 题目: 请实现一个函数,把字符串 s 中的每个空格替换成"%20". 示例 1: 输 ...
最新文章
- php in yii framework
- 重磅官宣:评职称将不做论文数量硬性要求!职称改革任务总体完成
- opencv 凹凸性检测 和 缺陷分析
- python之vscode中手动选择python解释器(mac)
- springboot+mybatis集成自定义缓存ehcache用法笔记
- 哈佛成功金句 -25则
- php中函数封装怎么弄,php封装函数步骤
- pythonpandas读取csv文件最后一行_简单小案例(一):使用Pandas在Python中读取和写入CSV文件...
- mysql 5.7.26安装步骤_centOS7.4 安装 mysql 5.7.26的教程详解
- REST another WebService???
- CareUEyes Pro(电脑防蓝光软件)官方中文版V2.0.0.9 | 电脑护眼软件下载
- Java设置PPT幻灯片背景——纯色、渐变、图片背景
- Illustrator CS2入门与实战视频教程
- nginx启动提示nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
- Elastic认证考试过程(2022.11.13 06:15)
- [AAM-GCN Neurocomputing2021] Attention adjacency matrix based graph convolutional networks for skele
- macbookpro 2021 各种软件设置中找不到麦克风权限问题
- 【内核笔记】博文2021回顾-2022规划
- python股票自动 选股 与 止损 止盈 脚本
- 支持html5特性的浏览器,五大主流浏览器对CSS3和HTML5特性支持情况的详细清单
热门文章
- Leetcode--191. 位1的个数
- 信号时频图的横纵坐标对调
- response.end后抛了异常_(七)异常处理
- ospf hello时间和dead_网络工程师_思科 | OSPF由简到难,配合命令学
- python assert函数
- matlab调用ANSYS--------2
- python压缩文件
- AN IMAGE IS WORTH 16X16 WORDS :TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE(VIT)
- 图论基础知识--最小生成树算法kruskal(克鲁斯克尔)和普里姆算法(Prim算法);最短路径算法Dijkstra(迪杰斯特拉)和Floyd(弗洛伊德)
- LeNet网络配置文件 lenet_train_test.prototxt