力扣题目解析--正则表达式匹配

题目

给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。

  • '.' 匹配任意单个字符
  • '*' 匹配零个或多个前面的那一个元素

所谓匹配,是要涵盖 整个 字符串 s 的,而不是部分字符串。

 

示例 1:

输入:s = "aa", p = "a"
输出:false
解释:"a" 无法匹配 "aa" 整个字符串。

示例 2:

输入:s = "aa", p = "a*"
输出:true
解释:因为 '*' 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 'a'。因此,字符串 "aa" 可被视为 'a' 重复了一次。

示例 3:

输入:s = "ab", p = ".*"
输出:true
解释:".*" 表示可匹配零个或多个('*')任意字符('.')。

提示:

  • 1 <= s.length <= 20
  • 1 <= p.length <= 20
  • s 只包含从 a-z 的小写字母。
  • p 只包含从 a-z 的小写字母,以及字符 . 和 *
  • 保证每次出现字符 * 时,前面都匹配到有效的字符

代码展示 

class Solution {
public:bool isMatch(std::string s, std::string p) {int m = s.length(); // 获取字符串 s 的长度int n = p.length(); // 获取字符串 p 的长度// dp[i][j] 表示 s 的前 i 个字符和 p 的前 j 个字符是否匹配std::vector<std::vector<bool>> dp(m + 1, std::vector<bool>(n + 1, false));// 空字符串和空模式匹配dp[0][0] = true;// 处理模式中的 '*' 字符for (int j = 1; j <= n; ++j) {if (p[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[j - 1] == '.' || p[j - 1] == s[i - 1]) {dp[i][j] = dp[i - 1][j - 1];} else if (p[j - 1] == '*') {// * 匹配零个前面的字符dp[i][j] = dp[i][j - 2];// * 匹配一个或多个前面的字符if (p[j - 2] == '.' || p[j - 2] == s[i - 1]) {dp[i][j] = dp[i][j] || dp[i - 1][j];}}}}return dp[m][n];}
};

 

逐句解释

  1. 获取字符串长度

    int m = s.length(); // 获取字符串 s 的长度
    int n = p.length(); // 获取字符串 p 的长度
    • m 存储字符串 s 的长度。
    • n 存储字符串 p 的长度。
  2. 初始化 DP 表

    std::vector<std::vector<bool>> dp(m + 1, std::vector<bool>(n + 1, false));
    • 创建一个二维布尔向量 dp,大小为 (m + 1) x (n + 1),所有元素初始化为 false
    • dp[i][j] 表示 s 的前 i 个字符和 p 的前 j 个字符是否匹配。
  3. 处理空字符串和空模式

    dp[0][0] = true;
    • dp[0][0] 表示空字符串和空模式匹配。
  4. 处理模式中的 * 字符

    for (int j = 1; j <= n; ++j) {if (p[j - 1] == '*') {dp[0][j] = dp[0][j - 2];}
    }
    • 遍历模式 p 的每个字符(从 1 到 n)。
    • 如果当前字符是 *,则 dp[0][j] 依赖于 dp[0][j - 2],即 * 可以匹配零个前面的字符。
  5. 填充 DP 表

    for (int i = 1; i <= m; ++i) {for (int j = 1; j <= n; ++j) {if (p[j - 1] == '.' || p[j - 1] == s[i - 1]) {dp[i][j] = dp[i - 1][j - 1];} else if (p[j - 1] == '*') {// * 匹配零个前面的字符dp[i][j] = dp[i][j - 2];// * 匹配一个或多个前面的字符if (p[j - 2] == '.' || p[j - 2] == s[i - 1]) {dp[i][j] = dp[i][j] || dp[i - 1][j];}}}
    }
    • 遍历字符串 s 的每个字符(从 1 到 m)。
    • 遍历模式 p 的每个字符(从 1 到 n)。
    • 如果 p[j - 1] 是 . 或者与 s[i - 1] 相同,则 dp[i][j] 依赖于 dp[i - 1][j - 1]
    • 如果 p[j - 1] 是 *,则有两种情况:
      • * 匹配零个前面的字符,dp[i][j] 依赖于 dp[i][j - 2]
      • * 匹配一个或多个前面的字符,如果 p[j - 2] 是 . 或者与 s[i - 1] 相同,则 dp[i][j] 依赖于 dp[i - 1][j]
  6. 返回结果

    return dp[m][n];
    • 返回 dp[m][n],表示 s 和 p 是否匹配。

总结

  • 动态规划:使用动态规划方法来处理正则表达式的匹配问题,确保每个字符和模式的组合都被正确处理。
  • 索引检查:确保在访问字符串索引时,索引在有效范围内,避免越界错误。
  • 特殊情况处理:特别处理 * 和 . 的匹配规则,确保 * 可以匹配零个或多个前面的字符,. 可以匹配任意字符。

 

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

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

相关文章

SSM大学生校园交流论坛-计算机设计毕业源码31910

摘 要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了大学生校园交流论坛的开发全过程。通过分析大学生校园交流论坛管理的不足&#xff0c;创建了一个计算机管理大学生校园交流论坛的方案。文章介绍了大学生校园交…

c语言简单编程练习9

1、输入一个整数&#xff0c;判断它是否为回文数 例&#xff1a;输入&#xff1a;12321 输出&#xff1a;该数是回文数 输入&#xff1a;12323 输出&#xff1a;该数不是回文数 #include <stdio.h> int huiwenshu(int num) {int a[100];int i, n, j…

技术面没过,竟然是因为我没用过Pytest框架?

01 概述 pytest是一个非常成熟的全功能的Python测试框架&#xff0c;主要特点有以下几点&#xff1a; 简单灵活&#xff0c;容易上手&#xff0c;文档丰富&#xff1b; 支持参数化&#xff0c;可以细粒度地控制要测试的测试用例&#xff1b; 能够支持简单的单元测试和复杂的…

通用方式创建未知文件后缀文件

困惑&#xff1a;比如平时想创一个类似&#xff1a;Dockerfile 文件如何玩&#xff1f; entrypoint.sh 如何玩&#xff1f; windows平台&#xff0c;直接命令行&#xff1a; mac平台或者linux平台也类似

如何用PPT画箭头?用这2个ppt软件快速完成绘图!

ppt怎么画箭头&#xff1f; 有时在ppt中绘制流程图或传达承上启下的含义时&#xff0c;会用到箭头形状&#xff0c;运用到箭头元素来增强表达的清晰度和逻辑性。那可能有人会问&#xff0c;ppt怎么画箭头&#xff1f; 这似乎是一个小问题&#xff0c;但如果你对ppt工具不够熟…

自攻螺钉的世纪演变:探索关键设计与应用

自攻螺钉作为现代工业和建筑中的不可或缺的标准部件&#xff0c;经过了超过100年的发展和创新。从1914年最早的铁螺钉设计到今天的自钻自攻螺钉&#xff0c;自攻螺钉的设计不断优化&#xff0c;以适应更复杂的应用需求。本文将回顾自攻螺钉的演变历程&#xff0c;分析其设计原理…

HTB:PermX[WriteUP]

目录 连接至HTB服务器并启动靶机 1.How many TCP ports are listening on PermX? 使用nmap对靶机TCP端口进行开放扫描 2.What is the default domain name used by the web server on the box? 使用curl访问靶机80端口 3.On what subdomain of permx.htb is there an o…

Python 项目国际化:使用 Babel 实现多语言支持

文章目录 如何使用 Babel 实现 Python 项目国际化1. 安装 Babel2. 设置项目目录结构3. 标记可翻译的文本4. 提取可翻译的文本生成文件 —— 生成pot文件4.1 有配置文件方式&#xff08;使用 babel.cfg&#xff09;4.1.1. 创建 babel.cfg 文件4.1.2. 提取翻译内容 4.2 无配置文件…

信号-2-信号捕捉

相关概念&#xff1a;递达 未决 / 阻塞 忽略 阻塞 vs 忽略 阻塞&#xff1a; 如果指定信号信号被阻塞&#xff0c; block期间该信号不能被递达&#xff0c;一直在pending表中。知道block被撤销后&#xff0c; 该信号才能递达&#xff0c;递达后对应pending位置置零。 忽…

正则表达式1 re.match惰性匹配详解案例

点个关注 re.match() re.match() 函数尝试从字符串的开头开始匹配一个模式&#xff0c;如果匹配成功&#xff0c;返回一个匹配成功的对象&#xff0c;否则返回None。大小写区分&#xff0c;内容匹配不到后面的,只能匹配一个&#xff0c;不能有空格&#xff08;开头匹配&#…

如何针对云计算安全进行等保测评?

等级保护作为我国网络安全法明确的重要制度&#xff0c;已在我国信息系统安全保驾护航中发挥着重要作用。目前&#xff0c;等级保护已经进入了2.0时代&#xff0c;“云、大、物、移、工控”纳入等保监管。 当前&#xff0c;按照传统等级保护技术要求实施的安全策略已经不能适应…

软考:性能测试的几个方面

性能测试的指标&#xff1a; 响应时间&#xff0c;吞吐量&#xff0c;并发用户数&#xff0c;资源利用率等 四个方面&#xff1a; 1、发现缺陷 2、性能调优 3、评估系统能力&#xff0c;不仅需要&#xff0c;还需要。 4、验证稳定性和可靠性

Vue(JavaScript)读取csv表格并求某一列之和(大浮点数处理: decimal.js)

文章目录 想要读这个表格&#xff0c;并且求第二列所有价格的和方法一&#xff1a;通过添加文件输入元素上传csv完整&#xff08;正确&#xff09;代码之前的错误部分因为价格是小数&#xff0c;所以下面的代码出错。如果把parseFloat改成parseInt&#xff0c;那么求和没有意义…

搭建兰空图床并配合PicGo实现批量上传

文章目录 服务器安装docker安装数据库部署兰空图床兰空图床配置邮箱验证配合PicGo实现批量上传 最近想试试自己搭建图床&#xff0c;虽然免费的又拍云够用了&#xff0c;但对象存储和图床还是有区别的&#xff0c;用起来有些复杂&#xff0c;所以打算试试兰空图床 服务器 想搭建…

如何对数据库的表字段加密解密处理?

对于表格数据的加密处理&#xff0c;通常涉及到对数据库中存储的数据进行加密&#xff0c;以保护敏感信息。 Java示例&#xff08;使用AES算法加密数据库表数据&#xff09; 首先&#xff0c;你需要一个数据库连接&#xff0c;这里假设你使用的是JDBC连接MySQL数据库。以下是…

LLM训练”中的“分布式训练并行技术;分布式训练并行技术

目录 “LLM训练”中的“分布式训练并行技术” 分布式训练并行技术 数据并行 流水线并行:按阶段(stage)进行切分 张量并行 序列并行 多维混合并行 自动并行 MOE并行 重要的分布式AI框架 “LLM训练”中的“分布式训练并行技术” 随着深度学习技术的不断发展,特别是…

TS学习笔记

一、TS运行环境搭建 1、安装 安装命令 npm i -g typescript 第一步&#xff1a;新建index.html和demo.ts 第二步&#xff1a;在index.html引入demo.ts文件 第三步&#xff1a;运行TS的命令 tsc demo.ts 注意&#xff1a;运行命令后&#xff0c;会将ts文件转换成js文件 …

ubuntu 22.04 server 安装 和 初始化 LTS

ubuntu 22.04 server 安装 和 初始化 下载地址 https://releases.ubuntu.com/jammy/ 使用的镜像是 ubuntu-22.04.5-live-server-amd64.iso usb 启动盘制作工具 https://rufus.ie/zh/ rufus-4.6p.exe 需要主板 支持 UEFI 启动 Ubuntu22.04.4-server安装 流程 https://b…

Python接口自动化测试实战

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 接口自动化测试是指通过编写程序来模拟用户的行为&#xff0c;对接口进行自动化测试。Python是一种流行的编程语言&#xff0c;它在接口自动化测试中得到了广泛…

day01 - web开发简介

本课程涉及到的技术&#xff1a; Vue ElementUI/Html Js SpringBoot–Spring SpringMvc MyBatis(Plus) SSM Axios 学习路径&#xff1a; 前端主要&#xff1a; Html5css3JavaScript(JQuery)–>Vue(Node.js也可以学习一 下&#xff0c;服务端js)ElementUi(uni-app) 后端主要…