Leetcode JAVA刷刷站(10)正则表达式匹配

news/2024/9/17 19:01:18/ 标签: leetcode, 算法, java

一、题目概述

二、思路方向 

       在Java中,实现一个支持'.'和'*'的正则表达式匹配器,可以通过递归或动态规划(DP)的方法来完成。这里,我将使用动态规划的方法来解决这个问题,因为它更容易理解和实现。

       动态规划的思路是,我们可以创建一个二维的布尔数组dp,其中dp[i][j]表示字符串s的前i个字符和模式p的前j个字符是否匹配。初始化时,dp[0][0]true(空字符串和空模式匹配),而dp[0][j](对于所有j > 0)只有在p的前j个字符都是*时才为true,因为*可以匹配零个字符。

       接下来,我们遍历dp数组,填充剩余的条目。对于每个(i, j),我们考虑以下情况:

  1. 如果p[j-1]不是*,那么dp[i][j]为真当且仅当s[i-1] == p[j-1]p[j-1] == '.'dp[i-1][j-1]为真。
  2. 如果p[j-1]*,那么有两种可能性:
    • 忽略*和前面的字符,即看dp[i][j-2]
    • 匹配零个或多个前面的字符,这取决于dp[i-1][j](如果s[i-1]匹配p[j-2],则可以通过添加s[i-1]到匹配中)为真。

三、代码实现 

java">public class Solution {  public boolean isMatch(String s, String p) {  int m = s.length();  int n = p.length();  // 创建一个二维布尔数组dp  boolean[][] dp = new boolean[m + 1][n + 1];  dp[0][0] = true; // 空字符串和空模式匹配  // 初始化dp[0][j],只有当p全是*时才匹配  for (int j = 1; j <= n; j++) {  if (p.charAt(j - 1) == '*') {  dp[0][j] = dp[0][j - 2];  }  }  // 填充dp数组  for (int i = 1; i <= m; i++) {  for (int j = 1; j <= n; j++) {  if (p.charAt(j - 1) != '*') {  dp[i][j] = (s.charAt(i - 1) == p.charAt(j - 1) || p.charAt(j - 1) == '.') && dp[i - 1][j - 1];  } else {  // 两种情况:匹配0次或多次前面的字符  dp[i][j] = dp[i][j - 2]; // 忽略*和前面的字符  if (s.charAt(i - 1) == p.charAt(j - 2) || p.charAt(j - 2) == '.') {  dp[i][j] = dp[i][j] || dp[i - 1][j];  }  }  }  }  return dp[m][n];  }  public static void main(String[] args) {  Solution solution = new Solution();  System.out.println(solution.isMatch("aa", "a"));    // false  System.out.println(solution.isMatch("aa", "a*"));   // true  System.out.println(solution.isMatch("ab", ".*"));   // true  System.out.println(solution.isMatch("aab", "c*a*b")); // true  System.out.println(solution.isMatch("mississippi", "mis*is*p*.")); // false  }  
}

执行结果:

 四、小结 

       这个实现通过动态规划解决了正则表达式的匹配问题,时间复杂度为O(mn),空间复杂度也为O(mn),其中m和n分别是字符串s和模式p的长度。

 结语 

因为遇见你,我才知道我也能具有美丽的记忆。

所以,无论你怎样对待我,

我都会用心去宽恕你的恨

用心去铭记你的好

!!!


http://www.ppmy.cn/news/1507173.html

相关文章

笔记:线性回归,模型轻量化,LORA

1.正确理解线性回归 将回归系数解释为比较,这个提示改变了我看待回归系数的方式。 以此线性回归方程为例 salary -20 0.6 * height 10.6 * male error 其中工资以每 1000 美元计算&#xff0c;身高以英寸计算 在这种情况下&#xff0c;高度的估计影响为 0.6 或 600 美元似…

【killall】Centos/Linux killall命令详细介绍

【killall】Centos/Linux killall命令详细介绍 简介 基础语法 选项介绍 基本用法 注意事项 简介 系统版本&#xff1a;Centos7.6 killall 命令&#xff0c;最大的特征就是可以以名字的方式杀死进程&#xff0c;类似的命令有 pkill 命令&#xff0c;与 kill 命令相比有一定…

sql server 通过 sql查询今天、本周、上周、本月、上月、今年、去年的时间范围

sql server 通过 sql查询今天、本周、上周、本月、上月、今年、去年的时间范围 因为经常用到&#xff0c;做个笔记记录下 select /*今天*/ convert(varchar(10),CAST(GETDATE() AS DATE),120), convert(varchar(10),CAST(GETDATE() AS DATE),120), /*本周*/ convert(varchar…

HAproxy 七层负载均衡调度器详解及配置

HAproxy 七层负载均衡 负载均衡技术 负载均衡&#xff08;Load Balance&#xff09;&#xff1a;一种服务&#xff0c;或基于硬件设备实现的高可用的反向代理技术&#xff0c;是指将特定的业务流量分摊给一个或多个后端的特定服务器或设备&#xff0c;实现高并发处理业务流量…

git系统学习

git系统学习 git命令行获取git 版本号 创建初始版本库创建git库初始化用户名和密码查看用户名和邮箱修改用户名和密码 将文件添加到版本库中删除暂存文件提交代码查看提交信息查看更加详细的信息查看提交差异版本库内文件的删除和重命名删除库里的文件重命名库里的文件 打标签查…

Linux Shell编程--数组

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除&#xff01; 一、简介 Shell 脚本中的数组允许你存储多个值&#xff0c;并可以通过索引访问它们。Shell 中的数组是一维的。 二、声明数组 在Shell…

鸿蒙HarmonyOS开发:多种内置弹窗及自定义弹窗的详细使用指南

文章目录 一、消息提示框&#xff08;showToast&#xff09;1、导入模块2、语法3、参数4、示例5、效果 二、对话框&#xff08;showDialog&#xff09;1、导入模块2、语法3、参数4、示例5、效果 三、警告弹窗&#xff08;AlertDialog&#xff09;1、语法2、参数3、AlertDialogP…

docker安装redis单机部署的redis.conf配置

下面是一个简单的 Redis 配置文件 (redis.conf) 示例&#xff0c;它适合docker单机部署环境&#xff0c;并且启用了密码保护。这个配置文件包含了最基本的设置&#xff0c;您可以根据需要进行扩展。 # 服务器监听的地址 bind 0.0.0.0# 服务器监听的端口 port 6379# 设置密码 r…

期权价格的奥秘:深入理解影响因素

在金融市场中&#xff0c;期权作为一种衍生工具&#xff0c;为投资者提供了风险管理和资产增值的多种可能性。期权价格的波动往往令人着迷&#xff0c;但其背后的定价机制却充满了复杂性。本文将带您探索期权价格变化的奥秘&#xff0c;并尝试以浅显易懂的方式&#xff0c;解析…

Oceanbase 执行计划

test100 CREATE TABLE `test100` ( `GRNT_CTR_NO` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT 担保合同编号, `GRNT_CTR_TYP` varchar(3) COLLATE utf8mb4_bin NOT NULL COMMENT 担保合同类型, `COLC_GRNT_IND` varchar(1) COLLATE utf8mb4_bin DEFAULT NULL …

1.Windows安装Maven和搭建Nexus私服

一、Windows安装Maven 首先安装jdk。这个没什么说的。接着安装Maven 下载Maven的安装包&#xff0c;解压到 D:\apache-maven-3.5.2 然后新建用户环境变量M2_HOME&#xff1a; 接着编辑用户环境变量Path&#xff0c;增加%M2_HOME%\bin&#xff08;下图中少写了一个%&#xff…

Postman接口测试工具使用方法

Postman 是一个强大的 API 开发和测试工具&#xff0c;广泛用于开发、测试和文档编写。 安装 Postman&#xff1a; 前往 https://www.postman.com/ 官网 下载适用于你的操作系统的安装包。安装完成后&#xff0c;启动 Postman。 创建账户&#xff08;可选&#xff09;&#…

视频号直播回放怎么下载?

一、如果是下载自己直播回放视频&#xff1a; 方法一&#xff1a;视频号助手 打开网址&#xff1a;视频号助手 登陆账号后。下面路径&#xff0c;先点击成回放&#xff0c; 后就可以在下面路径&#xff0c;下载全场回放 但是这种有个缺点&#xff0c;就是不能分段下载。这样…

【ES6】使用Set和Map进行全组合判断

判断数据集是否为全组合关系 例如下列表格&#xff0c;字段1包含&#xff08;甲、乙&#xff09;值&#xff0c;字段2包含&#xff08;a、b&#xff09;值&#xff0c;字段3包含&#xff08;1、2、3&#xff09;值&#xff0c;每种组合情况都可以在数据集的行记录中找到有且仅…

QT实现一个系统参数管理窗口

为了实现一个管理系统参数的设计&#xff0c;我们可以创建一个配置参数类来封装配置的读取和写入操作&#xff0c;并使用一个 QWidget 作为用户界面来管理这些参数。以下是如何设计一个这样的系统&#xff0c;包括配置参数类和管理界面。 1. 配置参数类 我们创建一个 ConfigM…

数据库篇--八股文学习第十八天| MySQL和Redis的区别是什么;Redis有什么优缺点?为什么用Redis查询会比较快

1、MySQL和Redis的区别是什么 答&#xff1a; Redis基于键值对&#xff0c;支持多种数据结构&#xff1b;而MySQL是一种关系型数据库&#xff0c;使用表来组织数据。Redis将数据存在内存中&#xff0c;通过持久化机制将数据写入磁盘&#xff0c;MySQL通常将数据存储在磁盘上。…

Ubuntu安装 IDEA

一、在官网下载 IDEA 下载IDEA For LinuxDownload the latest version of IntelliJ IDEA for Windows, macOS or Linux.https://www.jetbrains.com/idea/download/?sectionlinux下载好的安装包解压到/opt/中&#xff0c;目录名更改为 idea 二、对/opt/idea 目录下所有文件授予…

Java开发工具IDEA

IDEA概述 Intellij IDEA IDEA全称Intellij IDEA&#xff0c;是用于Java语言开发的集成环境&#xff0c;它是业界公认的目前用于Java程序开发最好的工具。 集成环境 把代码编写&#xff0c;编译&#xff0c;执行&#xff0c;调试等多种功能综合到一起的开发工具。 IDEA下载和安…

Unity自带的UGUI ScrollView刷新不及时问题

self:RefreshCommentsList()self.scrollView self.CommentsView:GetComponent(ScrollRect) self.scrollView.verticalNormalizedPosition 0如上所示&#xff0c;当我想刷新Unity中的一个ScrollView的列表后&#xff0c;将这个列表瞬间移至底部。但是上述这三行代码会出现一个…

关于网络数据的一些思考

为了给游戏用户带来更好的体验&#xff0c;但又想兼顾稳定性&#xff0c;因此有了kcp这样的技术&#xff0c;可如果是面临海外产品这是远远不够的 不同国家&#xff0c;不同地区&#xff0c;不同企业&#xff0c;不同用户所使用的设备千奇百怪。甚至与安装师傅的配置也有关系。…