[Leedcode][第十题][剑指offer]面试题第[19]题[正则表达式][动态规划][递归][JAVA]

【问题描述】[困难]

请实现一个函数用来匹配包含'. '和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但与"aa.a"和"ab*a"均不匹配。示例 1:输入:
s = "aa"
p = "a"
输出: false
解释: "a" 无法匹配 "aa" 整个字符串。
示例 2:输入:
s = "aa"
p = "a*"
输出: true
解释: 因为 '*' 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 'a'。因此,字符串 "aa" 可被视为 'a' 重复了一次。
示例 3:输入:
s = "ab"
p = ".*"
输出: true
解释: ".*" 表示可匹配零个或多个('*')任意字符('.')。
示例 4:输入:
s = "aab"
p = "c*a*b"
输出: true
解释: 因为 '*' 表示零个或多个,这里 'c' 为 0 个, 'a' 被重复一次。因此可以匹配字符串 "aab"。
示例 5:输入:
s = "mississippi"
p = "mis*is*p*."
输出: false
s 可能为空,且只包含从 a-z 的小写字母。
p 可能为空,且只包含从 a-z 的小写字母以及字符 . 和 *,无连续的 '*'。

【解答思路】

1. 动态规划

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
时间复杂度:O(N^2) 空间复杂度:O(1)

class Solution {public boolean isMatch(String A, String B) {int n = A.length();int m = B.length();boolean[][] f = new boolean[n + 1][m + 1];for (int i = 0; i <= n; i++) {for (int j = 0; j <= m; j++) {//分成空正则和非空正则两种if (j == 0) {f[i][j] = i == 0;} else {//非空正则分为两种情况 * 和 非*if (B.charAt(j - 1) != '*') {if (i > 0 && (A.charAt(i - 1) == B.charAt(j - 1) || B.charAt(j - 1) == '.')) {f[i][j] = f[i - 1][j - 1];}} else {//碰到 * 了,分为看和不看两种情况//不看if (j >= 2) {f[i][j] |= f[i][j - 2];}//看if (i >= 1 && j >= 2 && (A.charAt(i - 1) == B.charAt(j - 2) || B.charAt(j - 2) == '.')) {f[i][j] |= f[i - 1][j];}}}}}return f[n][m];}
}

思路二:
在这里插入图片描述

class Solution {public boolean isMatch(String s, String p) {int m = s.length();int n = p.length();boolean[][] f = new boolean[m + 1][n + 1];f[0][0] = true;for (int i = 0; i <= m; ++i) {for (int j = 1; j <= n; ++j) {if (p.charAt(j - 1) == '*') {f[i][j] = f[i][j - 2];if (matches(s, p, i, j - 1)) {f[i][j] = f[i][j] || f[i - 1][j];}}else {if (matches(s, p, i, j)) {f[i][j] = f[i - 1][j - 1];}}}}return f[m][n];}public boolean matches(String s, String p, int i, int j) {if (i == 0) {return false;}if (p.charAt(j - 1) == '.') {return true;}return s.charAt(i - 1) == p.charAt(j - 1);}
}
2. 递归

时间复杂度:O(N) 空间复杂度:O(1)

class Solution {public boolean isMatch(String A, String B) {// 如果字符串长度为0,需要检测下正则串if (A.length() == 0) {// 如果正则串长度为奇数,必定不匹配,比如 "."、"ab*",必须是 a*b*这种形式,*在奇数位上if (B.length() % 2 != 0) return false;int i = 1;while (i < B.length()) {if (B.charAt(i) != '*') return false;i += 2;}return true;}// 如果字符串长度不为0,但是正则串没了,return falseif (B.length() == 0) return false;// c1 和 c2 分别是两个串的当前位,c3是正则串当前位的后一位,如果存在的话,就更新一下char c1 = A.charAt(0), c2 = B.charAt(0), c3 = 'a';if (B.length() > 1) {c3 = B.charAt(1);}// 和dp一样,后一位分为是 '*' 和不是 '*' 两种情况if (c3 != '*') {// 如果该位字符一样,或是正则串该位是 '.',也就是能匹配任意字符,就可以往后走if (c1 == c2 || c2 == '.') {return isMatch(A.substring(1), B.substring(1));} else {// 否则不匹配return false;}} else {// 如果该位字符一样,或是正则串该位是 '.',和dp一样,有看和不看两种情况if (c1 == c2 || c2 == '.') {return isMatch(A.substring(1), B) || isMatch(A, B.substring(2));} else {// 不一样,那么正则串这两位就废了,直接往后走return isMatch(A, B.substring(2));}}}
}

【总结】

1.总想着正向解决问题,非但没有考虑清楚情况,而且不全面,没有发现子问题立即转化为递归或动态规划的思想
2.归纳整理总结 考虑清楚所有情况
3.动态规划流程

第 1 步:设计状态
第 2 步:状态转移方程
第 3 步:考虑初始化
第 4 步:考虑输出
第 5 步:考虑是否可以状态压缩

转载链接:https://leetcode-cn.com/problems/zheng-ze-biao-da-shi-pi-pei-lcof/solution/zhu-xing-xiang-xi-jiang-jie-you-qian-ru-shen-by-je/

参考链接:https://leetcode-cn.com/problems/regular-expression-matching/solution/zheng-ze-biao-da-shi-pi-pei-by-leetcode-solution/

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

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

相关文章

图像的采样和量化

图像的采样和量化 图像成像模型 图像的采样和量化 图像数字化 •将代表图像的连续(模拟)信号转换为离散(数字) 信号的过程称为图像数字化 •步骤&#xff1a;采样和量化 •主要技术 成像&#xff1a;光信息&#xff0d;>电信号 模数转换&#xff08;A/DConverter&…

【解决问题】IDEA配置Tomcat添加Deployment时没有Artifact

下面这里别忘了把整个项目也拉到左边的output-root&#xff08;拉完之后会有个WEB-INF&#xff09;

像素间的关系

像素间的关系 像素空间的关系 图像由像素组成&#xff0c;像素在图像空间上按规 律排列&#xff0c;相互之间有一定的联系。 像素间联系 像素的邻域&#xff0d;邻接关系 •4邻域—— N 4( p )&#xff1a; p ( x , y ): ( x 1, y ); ( x -1, y) ( x , y 1); ( x , y -1) •…

Spring Cloud面试题

为什么需要学习Spring Cloud 什么是Spring Cloud 设计目标与优缺点 设计目标 优缺点 Spring Cloud发展前景 整体架构 主要项目 Spring Cloud Config Spring Cloud Netflix Spring Cloud Bus Spring Cloud Consul Spring Cloud Security Spring Cloud Sleuth Spring Cloud Stre…

【发现问题】IDEA设置全局新创建文件默认换行符

今晚读《阿里Java开发手册》的代码格式部分中&#xff0c;第十条强制规约引起了我的注意。说的是&#xff0c; IDE中文件的换行符使用UNIX格式&#xff0c;不要使用Windows格式。 于是上网搜索为何如此&#xff0c;得到以下答案&#xff1a; 在开发中&#xff0c;有可能会遇到某…

图像文件类型

图像的分类 按照图像的动态特性&#xff1a; •静止图像和运动图像 按照图像的色彩&#xff1a; •灰度图像和彩色图像 按照图像的维数&#xff1a; •二维图像&#xff0c;三维图像和多维图像。 位图是通过许多像素点表示一幅图像&#xff0c;每个 像素具有颜色属性和位置…

[Leedcode][JAVA][第739题][每日温度][暴力][单调栈]

【问题描述】[中等] 根据每日 气温 列表&#xff0c;请重新生成一个列表&#xff0c;对应位置的输出是需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高&#xff0c;请在该位置用 0 来代替。例如&#xff0c;给定一个列表 temperatures [73, 74, 75, 71, 69, 7…

MySQL学习笔记2

目录MySQL函数常用函数聚合函数&#xff08;常用&#xff09;数据库级别MD5加密&#xff08;拓展&#xff09;事务什么是事务索引索引的分类测试索引索引原则权限管理和备份用户管理MySQL备份规范数据库设计三大范式MySQL函数 常用函数 -- 数学运算SELECT ABS(-8) -- 绝对值 …

拓展资源

1&#xff0e;人类的视觉感知系统 眼睛中的光接收器主要是视觉细胞&#xff0c;它包括锥状体和杆状体。中央凹&#xff08;或称中心窝&#xff09;部 分特别薄&#xff0c;这部分没有杆状体&#xff0c;只密集地分布锥状体。它具有辨别光波波长的能力&#xff0c;因此&#xff…

HTML5前端开发学习路线建议,学习前端的必备知识点

Web前端开发工程师是一个很新的职业&#xff0c;是从事Web前端开发工作的工程师。主要进行网站开发&#xff0c;优化&#xff0c;完善的工作。网页制作是Web 1.0时代的产物&#xff0c;那时网站的主要内容都是静态的&#xff0c;用户使用网站的行为也以浏览为主。 一位好的Web前…

[Leedcode][JAVA][第990题][等式方程的可满足性][并查集]

【问题描述】[中等] 给定一个由表示变量之间关系的字符串方程组成的数组&#xff0c;每个字符串方程 equations[i] 的长度为 4&#xff0c;并采用两种不同的形式之一&#xff1a;"ab" 或 "a!b"。在这里&#xff0c;a 和 b 是小写字母&#xff08;不一定不…

图像基本运算概述型

图像基本运算概述型 图像基本运算的概述(Introduction) 图像基本运算的分类 点运算 点运算是指对一幅图像中每个像素点的灰度值进行计算 的方法。 代数运算、逻辑运算 代数运算或逻辑运算是指将两幅或多幅图像通过对应像 素之间的加、减、乘、除运算或逻辑与、或、非运算得 到…

web

1.添加tomcat 新建动态web 在WebContent下新建index.jsp Windows-->preferences-->Server-->Runtimes Environments 稍后tomcat启动成功&#xff0c;但访问tomcat首页报404 解决方法&#xff1a;将server里的项目removeAll&#xff0c;启动server&#xff0c;双击修改…

[剑指offer][JAVA]面试题第[20]题[表示数值的字符串][状态机]

【问题描述】[中等] 请实现一个函数用来判断字符串是否表示数值&#xff08;包括整数和小数&#xff09;。例如&#xff0c;字符串"100"、"5e2"、"-123"、"3.1416"、"0123"都表示数值&#xff0c;但"12e"、"…

点运算

线性点运算 线性点运算的应用 1&#xff09;如果a>1&#xff0c;输出图像的对比度增大&#xff08;灰度扩展&#xff09; 2&#xff09;如果0<a<1,输出图像的对比度减小&#xff08;灰度压缩&#xff09; 3&#xff09;如果a为负值&#xff0c;暗区域将变亮&#xff…

代数运算

代数运算 概念 代数运算是指两幅或多幅输入图像之间进行点对点的加、 减、乘、除运算得到输出图像的过程。如果记输入图像 为A(x,y)和B(x,y)&#xff0c;输出图像为C(x,y)&#xff0c;则有如下四种形 式&#xff1a; 逻辑运算 在进行图像理解与分析领域比较有用。运用这种方法…

[剑指offer][JAVA]面试题第[21]题[调整数组顺序使奇数位于偶数面前][双指针]

【问题描述】[简单] 输入一个整数数组&#xff0c;实现一个函数来调整该数组中数字的顺序&#xff0c;使得所有奇数位于数组的前半部分&#xff0c;所有偶数位于数组的后半部分。示例&#xff1a;输入&#xff1a;nums [1,2,3,4] 输出&#xff1a;[1,3,2,4] 注&#xff1a;[…

几何运算

几何运算 .概念 几何运算就是改变图像中物体对象&#xff08;像素&#xff09;之间的空 间关系。 从变换性质来分&#xff0c;几何变换可以分为图像的位置变换 &#xff08;平移、镜像、旋转&#xff09;、形状变换&#xff08;放大、缩小&#xff09;以 及图像的复等合变换…

vmware创建虚拟机并安装centos7系统

一、vmware创建虚拟机 1、添加一个全新的虚拟机 2、以典型的方式创建虚拟机&#xff0c;然后下一步 3、选择稍后安装操作系统&#xff08;这样我们等下可以自由选择操作系统&#xff09;&#xff0c;然后下一步 4、选择客户及操作系统类型及版本&#xff08;由于我这里将安装的…

MySQL学习笔记3——JDBC

目录JDBC简介数据库驱动JDBC第一个JDBC程序JDBC中各对象详解statement对象包装成工具类SQL注入问题PreparedStatement对象使用IDEA连接数据库JDBC操作事务数据库连接池DBCP需要用到的JAR包DBCP配置文件工具类测试代码C3P0需要用到的JAR包C3P0配置文件工具类测试代码结论JDBC简介…