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

news2024/12/22 0:44:32

一、题目概述

二、思路方向 

       在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]到匹配中)为真。

三、代码实现 

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.coloradmin.cn/o/2041607.html

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

相关文章

代码随想录算法训练营43期 | Day 13 —— 二叉树part01

代码随想录算法训练营 二叉树理论基础二叉树的种类1. 满二叉树2. 完全二叉数3. 二叉搜索树3. 平衡二叉搜索树 二叉树的存储方式二叉树遍历方式二叉树的定义 二叉树的递归遍历144.前序遍历145.后序遍历94.中序遍历 二叉树迭代遍历前序遍历&#xff08;迭代法&#xff09;后序遍历…

实战项目:贪吃蛇游戏的实现(下)

前言 今天我们将继续贪吃蛇游戏的实现&#xff0c;紧接上期我们已经实现了贪吃蛇游戏的大部分基础知识&#xff0c;我们上期主要是学习了Windows系统的API函数,并实现了大部分的贪吃蛇设计&#xff0c;那这期我们将完成剩余的设计部分&#xff0c;并完成代码的实现。 好&…

UEC++学习(十六)变量添加中文注释、ui设置中文文本

&#xff08;一&#xff09;变量添加中文注释 在C 项目中创建变量&#xff0c;并在蓝图中显示变量的英文名同时附带中文注释&#xff0c;可以使用UPROPERTY 的 ToolTip 元数据属性来实现 UPROPERTY(EditAnywhere, meta (ToolTip "弹夹最大容量"))int32 MagCapacit…

目标检测算法,Yolov7本地化部署标注、训练(二)

安全帽检测、口罩检测、行为检测、目标物体检测&#xff0c;随着深度学习和计算机视觉技术的不断发展&#xff0c;目标检测成为了研究热点之一。YOLOv7作为YOLO系列的新成员&#xff0c;以其高效和准确的性能受到了广泛关注。本文将介绍如何在本地部署并利用YOLOv7完成目标检测…

StormBamboo 入侵 ISP 并滥用不安全的软件更新机制

关键要点 StormBamboo 成功入侵了一家互联网服务提供商 (ISP)&#xff0c;以毒害目标组织的 DNS 响应。不安全的软件更新机制旨在在运行 macOS 和 Windows 的受害者机器上秘密安装恶意软件。StormBamboo 部署的恶意软件包括 MACMA 恶意软件的新变种。对 MACMA 最新版本的分析表…

Python学习入门实验

&#xff08;1&#xff09;掌握python数字类型的使用方法 &#xff08;2&#xff09;掌握将数学表达式转换成python语言表达式的方法及注意 &#xff08;3&#xff09;掌握有关运算符号的特殊要求 &#xff08;4&#xff09;掌握输入、输出函数的使用方法 &#xff08;5&am…

Python与netCDF数据之全面解析空间偏相关分析详解

概要 在气象学、海洋学、环境科学等领域,netCDF(Network Common Data Form)是一种常用的数据格式,用于存储和共享多维科学数据。偏相关分析(Partial Correlation Analysis)是一种统计方法,用于研究多个变量之间的关系,同时控制其他变量的影响。本文将详细介绍如何使用…

VTK-vtkStructuredGrid学习

vtkStructuredGrid是具有规则拓扑和不规则几何的数据集。可以理解为单元格顺序沿着坐标轴排列&#xff0c;但是每个单元格可以不一样。看了很多文字解释&#xff0c;感觉不清楚&#xff0c;直接用图解验证&#xff1a; 1.使用CAD随意绘制个网格草图 2.获取这些点信息&#xff…

Sealos 就是小团队的神器

作者&#xff1a;阳明。Kubernetes 布道师&#xff0c;公众号 K8s 技术圈主理人 最近我们新开发了一个项目 fastclass.cn&#xff0c;这个项目是一个独立开发者的学习网站&#xff0c;我们的目标是帮助你使用 Figma、Python、Golang、React、VUE、Flutter、ChatGPT 等设计构建真…

【linux】linux中如何通过systemctl来创建和管理服务

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

【网络】从零认识IPv4

目录 IP地址定义 网络标识和主机标识 子网掩码 IPv4地址的分类 全局地址和私有地址 个人主页&#xff1a;东洛的克莱斯韦克-CSDN博客 IP地址定义 IP是网络中每台设备的唯一标识符&#xff0c;用于识别和定位计算机、服务器、路由器等设备&#xff0c;以便它们能够在网络上…

VictoriaMetrics快速入门

文章目录 Multitenancy集群部署启动vmstorage服务启动vminsert服务启动 vmselect服务 配置使用集群大小调整和可伸缩性grafana展示参考资料 VictoriaMetrics是快速&#xff0c;经济高效且可扩展的时间序列数据库。它可以用作Prometheus的长期远程存储。 VictoriaMetrics集群包含…

鸿蒙开发5.0【同页面内的点击操作响应时延问题】分析思路案例

1. 场景导入 同页面内点击操作时延是指&#xff0c;应用内手指点击从离开屏幕开始&#xff0c;到页面发生变化的时间。常见场景包括点击后界面元素变化&#xff0c;弹出弹窗或者loading动画等场景。 2. 性能指标 2.1 性能衡量起始点介绍 1.点击操作响应时延的性能衡量的起点…

GitLab-CI/CD指南

由于公司没有运维&#xff0c;写go服务时各个环境编译部署还是略显麻烦&#xff0c;由于代码管理使用的是 gitlab&#xff0c;所以决定使用 gitlab 自带的 CI/CD 来做自动编译和部署&#xff0c;这样每次提交代码以后就可以自动部署到服务器上了。 gitlab 本身只有 CI/CD 的接…

金蝶云星辰V1与旺店通·企业版对接集成采购入库单查询(列表+详情)连通创建其他入库单(其他)

金蝶云星辰V1与旺店通企业版对接集成采购入库单查询&#xff08;列表详情&#xff09;连通创建其他入库单(其他) 接入系统&#xff1a;金蝶云星辰V1 金蝶云星辰基于金蝶云苍穹云原生PaaS平台构建&#xff0c;聚焦小型企业在线经营和数字化管理&#xff0c;提供财务云、税务云、…

操作系统中的进程:深入解析与理解

文章目录 一、什么是进程&#xff1f;&#x1f914;二、进程的特性 &#x1f31f;三、进程的组成 &#x1f9e9;四、进程的状态与转换 &#x1f504;&#x1f500;五、进程的调度与管理 &#x1f527;&#x1f500;六、代码示例&#xff08;C&#xff09;创建进程进程等待&…

scanf中%c前加不加空格的区别

%c前加空格可以让scanf跳过空白字符&#xff08;如空格、制表符、换行符等&#xff09;&#xff0c;直接读取非空白字符。如果不加空格就会读取空白字符。 可以用两段测试客官有无慧根的程序来说明这个问题&#xff0c;测试代码如下&#xff1a; #include <stdio.h> in…

Ubuntu22.04安卓编译环境搭建及so库编译

1.配置Android-ARM64开发环境工具链: vim ~/.profile 或者 ~/.bashrc 或者 /etc/profile 编辑环境变量文件 输入下面内容 export CROSS_TRIPLE=aarch64-linux-android export CROSS_ROOT=/usr/${CROSS_TRIPLE} export ANDROID_NDK=${CROSS_ROOT} export AS=${CROSS_ROOT}…

【人工智能】数据集合集!

本文将为您介绍10个经典、热门的数据集&#xff0c;希望对您在选择适合的数据集时有所帮助。 点击蓝字 关注我们 1 Habitat Platform 发布方&#xff1a; Facebook AI Research西蒙菲莎大学佐治亚理工学院Facebook Reality LabsIntel LabsUniversity of California, Berkeley…

1- 关键字static

文章目录 1 前言2 static修饰局部变量2.1 局部变量无static修饰2.2 局部变量有static修饰 3 static修饰全局变量 1 前言 在C语言中&#xff0c;static是用来修饰变量和函数的&#xff1a; 修饰局部变量 - 称为静态局部变量修饰全局变量 - 称为静态全局变量修饰函数 - 称为静态…