【LeetCode】剑指 Offer 19. 正则表达式匹配 p124 -- Java Version

news2025/2/20 21:48:37

题目链接:https://leetcode.cn/problems/zheng-ze-biao-da-shi-pi-pei-lcof/

1. 题目介绍(19. 正则表达式匹配)

请实现一个函数用来匹配包含'. ''*'的正则表达式。模式中的字符'.'表示任意一个字符,而’*'表示它前面的字符可以出现任意次(含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 = “cab”
输出: true
解释: 因为 ‘*’ 表示零个或多个,这里 ‘c’ 为 0 个, ‘a’ 被重复一次。因此可以匹配字符串 “aab”。

示例 5:

输入:
s = “mississippi”
p = “misisp*.”
输出: false

【条件约束】:

提示

  • s 可能为空,且只包含从 a-z 的小写字母。
  • p 可能为空,且只包含从 a-z 的小写字母以及字符 .*,无连续的 '*'

【相似题目】:

  • 【LeetCode】No.10. Regular Expression Matching – Java Version

2. 题解

2.1 递归 – O(2n)

时间复杂度O(2n),空间复杂度O(n)

在这里插入图片描述

class Solution {
    public boolean isMatch(String s, String p) {
        if (p.isEmpty()) return s.isEmpty();
        int sx = 0;
        int px = 0;
        return matchCore(s.toCharArray(), sx, p.toCharArray(), px);
  
    }

    public boolean matchCore(char[] str, int sx, char[] pattern, int px) {
        // 递归终止条件
        // 1. 同时结束
        if (sx == str.length && px == pattern.length) {
            return true;
        }
        // 2. pattern先结束
        if (sx != str.length && px == pattern.length) {
            return false;
        }

        // 当模式中的第二个字符是'*'时
        if (px + 1 < pattern.length && pattern[px+1] == '*' ){
            // 且模式的当前字符与字符串中的字符相匹配 or 模式当前字符为'.',可以匹配任意一个字符,
            if (sx != str.length && (pattern[px] == str[sx] || (pattern[px] == '.'))) {
                // 如果模式中的第一个字符和字符串中的第一个字符相匹配,下面就有2种选择
                // 1. 匹配1次或多次,一个一个往后匹配
                return matchCore(str, sx+1, pattern, px)
                // 2. 匹配0次,pattern直接跳过两个字符,即忽略"x*"
                || matchCore(str, sx, pattern, px+2);
            } else 
                // 匹配0次,pattern直接跳过两个字符,即忽略"x*"
                return matchCore(str, sx, pattern, px+2);
        } 
        // 当模式中的字符是'.'时,或模式中字符不是'.',但仍与字符串中字符相匹配时,接着匹配后面的字符
        if (sx != str.length && (str[sx] == pattern[px] || pattern[px] == '.'))
            return matchCore(str, sx+1, pattern, px+1);
        
        return false;
    }
}

在这里插入图片描述

2.2 动态规划 – O(mn)

时间复杂度O(mn),空间复杂度O(mn)
不得不说,动态规划确实快。
在这里插入图片描述
在这里插入图片描述
思路图解:
在这里插入图片描述

class Solution {
    public boolean isMatch(String s, String p) {
        int m = s.length() + 1, n = p.length() + 1;
        boolean[][] dp = new boolean[m][n];
        // dp[0][0] = true: 代表两个空字符串能够匹配。
        dp[0][0] = true;
        // 初始化首行
        // dp[0][j] = dp[0][j - 2] 且 p[j - 1] = '*': 首行 s 为空字符串,因此当 p 的偶数位为 * 时才能够匹配(即让 p 的奇数位出现 0 次,保持 p 是空字符串)
        for(int j = 2; j < n; j += 2)
            dp[0][j] = dp[0][j - 2] && p.charAt(j - 1) == '*';
        // 状态转移
        for(int i = 1; i < m; i++) {
            for(int j = 1; j < n; j++) {
                dp[i][j] = p.charAt(j - 1) == '*' ?
                    dp[i][j - 2] || dp[i - 1][j] && (s.charAt(i - 1) == p.charAt(j - 2) || p.charAt(j - 2) == '.') :
                    dp[i - 1][j - 1] && (p.charAt(j - 1) == '.' || s.charAt(i - 1) == p.charAt(j - 1));
            }
        }
        return dp[m - 1][n - 1];
    }
}

在这里插入图片描述

3. 参考资料

[1] 《剑指Offer》Java刷题 NO.52 正则表达式匹配(字符串、正则表达式、递归、动态规划) – 递归代码参考
[2] 剑指 Offer 19. 正则表达式匹配(动态规划,清晰图解)-- 动态规划解法参考

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

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

相关文章

图解LeetCode——剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

一、题目 输入一个整数数组&#xff0c;实现一个函数来调整该数组中数字的顺序&#xff0c;使得所有奇数在数组的前半部分&#xff0c;所有偶数在数组的后半部分。 二、示例 2.1> 示例&#xff1a; 【输入】nums [1,2,3,4] 【输出】[1,3,2,4] 【注】[3,1,2,4] 也是正确的…

基于vscode创建SpringBoot项目,连接postgresql数据库

1、Vue下载安装步骤的详细教程(亲测有效) 1_水w的博客-CSDN博客 2、Vue下载安装步骤的详细教程(亲测有效) 2 安装与创建默认项目_水w的博客-CSDN博客 3、基于vscode开发vue项目的详细步骤教程_水w的博客-CSDN博客 4、基于vscode开发vue项目的详细步骤教程 2 第三方图标库FontAw…

最新的Windows docker安装方法

什么是Docker&#xff1f;关于Docker的相关概述&#xff0c;请看&#xff1a;Docker_面向架构编程的博客-CSDN博客在Windows10 or Windows11中安装docker主要就两步&#xff1a;1.安装wsl22. 安装docker一、安装WSL2安装wslwsl --install然后重启一下电脑在cmd窗口可以查看自己…

如何使用CVE-Tracker随时获取最新发布的CVE漏洞信息

关于CVE-Tracker CVE- Tracker是一款功能强大的CVE漏洞信息收集和更新工具&#xff0c;该工具基于自动化ps脚本实现其功能&#xff0c;可以帮助广大研究人员轻松获取到最新发布的CVE漏洞信息。 CVE-Tracker采用PowerShell开发&#xff0c;可以在操作系统启动的时候自动运行Mi…

计算机组成原理4小时速成5:系统总线,总线分类,数据总线,地址总线,控制总线,总线传输率

计算机组成原理4小时速成5&#xff1a;系统总线&#xff0c;总线分类&#xff0c;数据总线&#xff0c;地址总线&#xff0c;控制总线&#xff0c;总线传输率 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学…

华为6面,测试岗报价11k,HR说我不尊重华为,他们没有那么低薪资岗位?

在不知道一个公司的普遍薪资水平的时候&#xff0c;很多面试者不敢盲目的开价&#xff0c;但就因为这样可能使得面试官怀疑你的能力。一位网友就在网上诉说了自己的经历&#xff0c;男子是一位测试员&#xff0c;已经有九年的工作经历了&#xff0c;能力自己觉得还不错。 因为…

matlab-初学

初次学习了解matlab的相关知识&#xff0c;跟着b站博主学习的&#xff0c;仅此记录学习过程的笔记与感悟。命令行小常识1.命令行给变量赋值&#xff0c;回车即运行一行。2.逗号反馈这一行所有的变量结果&#xff1b;分号则不反馈&#xff0c;单实际变量值已经改变(只是不在下方…

22- estimater使用 (TensorFlow系列) (深度学习)

知识要点 estimater 有点没理解透 数据集是泰坦尼克号人员幸存数据. 读取数据&#xff1a;train_df pd.read_csv(./data/titanic/train.csv) 显示数据特征&#xff1a;train_df.info() 显示开头部分数据&#xff1a;train_df.head() 提取目标特征&#xff1a;y_train tr…

Web前端:四大Web应用开发趋势和技术

就像其他行业一样&#xff0c;web应用程序开发每年都会经历巨大的变化。就像人们说的&#xff0c;变化是技术中唯一不变的东西。因此&#xff0c;我们这里有一些你可以期待的市场变化。Web应用开发趋势和技术1.市场对聊天机器人和人工智能寄予厚望已经说过很多次&#xff0c;也…

java 面试

面试目录概述需求&#xff1a;设计思路实现思路分析1.面试概要参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,challenge Survive. happy f…

JSTL核心库的简单使用

JSTL核心库的简单使用 7.1考试重点 7.1.1c:out输出数据 考试重点就是c的相关的 jar包下载地址:Apache Tomcat - Apache Taglibs Downloads 看会典型应用就可以<% page contentType"text/html;charsetUTF-8" language"java" %> <% taglib uri"…

DolphinDB 通过 Telegraf + Grafana 实现设备指标的采集监控和展示

基于原始数据采集的可视化监控是企业确保设备正常运行和安全生产的重要措施。本文详细介绍了如何从DolphinDB 出发&#xff0c;借助 Telegraf 对设备进行原始数据采集&#xff0c;并通过 Grafana 实现数据的可视化&#xff0c;从而实现设备指标的实时监控。1. 概览Telegraf 是 …

Mybatis-plus逻辑删除更新字段

MybatisPlus版本 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.2</version> </dependency> <dependency><groupId>com.baomidou</groupId&g…

优思学院|DFMEA是全球制造业的必修课!

DFMEA&#xff08;Design Failure Mode and Effects Analysis&#xff09;是一种分析技术&#xff0c;在产品设计的早期阶段识别和解决潜在的失效问题。它通过分析设计的各个方面&#xff0c;识别潜在的失效模式和影响&#xff0c;并提出相应的改进措施&#xff0c;以减少失效的…

服装企业 采购系统

技术&#xff1a;Java、JSP等摘要&#xff1a;随着我国市场经济的不断发展,企业之间的竞争越来越激烈,只有对企业库存物资资源全面掌握,充分发挥闲置资源的利用,对资源进行优化配置,才能使企业效益达到最大化。只有通过规范科学的物资管理手段,才能节省物资采购成本,提高工作效…

Java——面向对象

目录 前言 一、什么是面向对象&#xff1f; 面向过程 & 面向对象 面向对象 二、回顾方法的定义和调用 方法的定义 方法的调用 三、类与对象的创建 类和对象的关系 创建与初始化对象 四、构造器详解 五、创建对象内存分析 六、封装详解 七、什么是继承&#x…

Unity TextMeshPro

Unity TextMeshPro 简介 TextMeshPro(也简称为TMP)号称是Unity的终极文本解决方案&#xff0c;它是Unity 的 UI 文本和旧版文本网格体的完美替代品。 功能强大且易于使用&#xff0c;使用高级文本渲染技术以及一组自定义着色器;提供实质性的视觉质量改进&#xff0c;同时在文…

Python基础教程(入门教程),初学者学Python编程如何快速入门?

【导语】Python是一种跨平台的计算机程序设计语言&#xff0c;通过Python编程&#xff0c;我们能够解决现实生活中的很多困难&#xff0c;现如今&#xff0c;我们工作中的许多工作都需要通过编写计算机软件来完成&#xff0c;那么初学者学Python编程如何快速入门呢?下面就来给…

【用Group整理目录结构 Objective-C语言】

一、接下来,我们看另外一个知识点,怎么用Group把这一堆乱七八糟的文件给它整理一下,也算是封装一下吧, 1.这一堆杂乱无章的文件: 那么,哪些类是属于模型呢,哪些类是属于视图呢,哪些类是属于控制器呢, 我们接下来通过Group的方式,来给它们分一下类, 这样看起来就好…

虚拟机安装ubuntu窗口自适应问题以及软件窗口显示不全解决方法

这部分查了很多博客&#xff0c;首先感谢前人栽树。 直接上我在安装过程中的有效解决步骤&#xff0c; 文后会描述遇到的非有效解决步骤&#xff0c;以供遇到相同问题的同学参考。 打开终端窗口 (ctrlaltt),当然肯定是一条一条的执行。 sudo apt-get update sudo apt-get upg…