剑指 Offer(第2版)面试题 19:正则表达式匹配

剑指 Offer(第2版)面试题 19:正则表达式匹配

  • 剑指 Offer(第2版)面试题 19:正则表达式匹配
    • 解法1:递归
    • 解法2:动态规划

剑指 Offer(第2版)面试题 19:正则表达式匹配

题目来源:

  1. AcWing 30. 正则表达式匹配
  2. LeetCode 10. 正则表达式匹配

解法1:递归

代码:

class Solution
{
public:bool isMatch(string s, string p){if (p.empty())return s.empty();return match(s, p, 0, 0);}bool match(string s, string p, int a, int b){if (b == p.size())return a == s.size();else if (a == s.size()){if (b == p.size() - 1 || p[b + 1] != '*')return false;return match(s, p, a, b + 2);}if (b + 1 == p.size())return a + 1 == s.size() && (s[a] == p[b] || p[b] == '.');if (p[b + 1] != '*'){if (s[a] == p[b] || p[b] == '.')return match(s, p, a + 1, b + 1);return false;}if (s[a] != p[b] && p[b] != '.')return match(s, p, a, b + 2);return match(s, p, a, b + 2) || match(s, p, a + 1, b + 2) || match(s, p, a + 1, b);}
};

注:这种写法不能在 LeetCode 上通过,爆栈了。

解法2:动态规划

代码:

class Solution
{
public:bool isMatch(string s, string p){int m = s.size(), n = p.size();// 状态矩阵vector<vector<bool>> dp(m + 1, vector<bool>(n + 1, false));// dp[i,j]: 表示以i截止的字符串是否可以被以j截止的正则表达式匹配//  初始化dp[0][0] = true;// 在匹配0次的情况下,浪费一个字符+星号的组合,没有匹配任何s中的字符for (int i = 1; i <= n; i++)if (p[i - 1] == '*') //'*'匹配零个或多个前面的那一个元素dp[0][i] = dp[0][i - 2];// 状态转移for (int i = 1; i <= m; i++)for (int j = 1; j <= n; j++){if (p[j - 1] != '*') // 当前p匹配的字符不是'*'{if (match(s[i - 1], p[j - 1]) == true) // 当前s匹配的字符和p匹配的字符相符合dp[i][j] = dp[i - 1][j - 1];else // 当前s匹配的字符和p匹配的字符不相符合,dp[i,j]=falsedp[i][j] = false;}else // 当前p匹配的字符为'*'{// 当前s匹配的字符和p匹配的p中一个字符+星号的组合相匹配,// 要么跳过一个字符+星号的组合,要么看dp[i-1][j]是否为true,或运算连接if (match(s[i - 1], p[j - 2]) == true)dp[i][j] = dp[i - 1][j] || dp[i][j - 2];else // 当前s匹配的字符和p中一个字符+星号的组合不相匹配,跳过该组合dp[i][j] = dp[i][j - 2];}}return dp[m][n];}// 辅函数bool match(char &sc, char &pc){//'.'匹配任意单个字符,故一定匹配成功if (pc == '.')return true;// 不然看s字符和p字符是否相同return sc == pc;}
};

复杂度分析:

时间复杂度:O(m*n),其中 m 是字符串 s 的长度,n 是字符串 p 的长度。

空间复杂度:O(m*n),其中 m 是字符串 s 的长度,n 是字符串 p 的长度。

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

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

相关文章

【链表Linked List】力扣-2 两数相加

目录 题目描述 解题过程 题目描述 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 …

JVM GUI可视化监控及诊断工具

工具既述 使用命令行工具或组合能帮您获取目标Java应用性能相关的基础信息&#xff0c;但它们存在下列局限&#xff1a; 无法获取方法级别的分析数据&#xff0c;如方法间的调用关系、各方法的调用次数和调用时间等&#xff08;这对定位应用性能瓶颈至关重要&#xff09;。要…

决战排序之巅(一)

决战排序之巅 插入排序直接插入排序 void InsertSort(int* arr, int n)希尔排序 void ShellSort(int* arr, int n)测试插入排序测试函数 void verify(int* arr, int n)测试 InsertSort测试 ShellSort测试速度 InsertSort & ShellSort 选择排序直接选择排序 void SelectSort…

天梯赛的善良(Python)

题目描述 天梯赛的善良 天梯赛是个善良的比赛。善良的命题组希望将题目难度控制在一个范围内&#xff0c;使得每个参赛的学生都有能做出来的题目&#xff0c;并且最厉害的学生也要非常努力才有可能得到高分。 于是命题组首先将编程能力划分成了 1 0 6 10^6 106 个等级&…

初试Jakarta EE项目 - Servlet + JSP

文章目录 一、Jakarta EE概述二、Servlet概述&#xff08;一&#xff09;Servlet的概念&#xff08;二&#xff09;Servlet的工作原理&#xff08;三&#xff09;Servlet的特点1、独立性2、灵活性3、生命周期管理 &#xff08;四&#xff09;Servlet的应用场景&#xff08;五&a…

从零开始,利用ChatGPT学会写作的完整指南

文章目录 前言了解ChatGPT访问OpenAI平台使用ChatGPT进行简单的对话定义写作主题逐步生成文章段落添加个性化和细节编辑和润色反复修改直至满意 图书推荐内容简介作者简介获取方式 前言 在数字时代&#xff0c;人工智能技术日益成熟&#xff0c;为我们提供了全新的学习和创作机…

Linux CentOS本地部署SQL Server数据库结合cpolar内网穿透实现公网访问

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;数据结构、Cpolar杂谈 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 安装sql server二. 局域网测试连接三. 安装cpolar内网穿透四. 将sqlserver映射…

探索C语言中的Shellcode从提取到执行

Shellcode是一种独立于应用程序的机器代码&#xff0c;通常用于实现特定任务&#xff0c;如执行远程命令、注入恶意软件或利用系统漏洞。在网络安全领域&#xff0c;研究Shellcode是理解恶意软件和提高系统安全性的关键一环。本文将深入探讨如何在C语言中提取Shellcode&#xf…

AI报告专题:创造性和生成式人工智能

今天分享的AI系列深度研究报告&#xff1a;《AI报告专题&#xff1a;创造性和生成式人工智能》。 &#xff08;报告出品方&#xff1a;Capgemini&#xff09; 报告共计&#xff1a;64页 AI一代 生成式人工智能 (AI)正在迅速改变我们与技术的交互方式&#xff0c;使机器能够创…

基于ssm在线医疗服务系统论文

摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0c;所以对于信息的宣传和管理就很关键。因此医疗服务信息的…

Linux---逻辑卷管理

本章主要介绍逻辑卷的管理。 了解什么是逻辑卷创建和删除逻辑卷扩展逻辑卷缩小逻辑卷逻辑卷快照的使用 前面介绍了分区的使用&#xff0c;如果某个分区空间不够&#xff0c;想增加空间是非常困难的。所以&#xff0c;建议尽可能使用逻辑卷而非普通的分区&#xff0c;因为逻辑卷…

贪心算法及相关题目

贪心算法概念 贪心算法是指&#xff0c;在对问题求解时&#xff0c;总是做出在当前看来是最好的选择。也就是说&#xff0c;不从整体最优上加以考虑&#xff0c;算法得到的是在某种意义上的局部最优解 。 贪心算法性质&#xff08;判断是否可以使用贪心算法&#xff09; 1、贪…

Web3之L2 ZK-Rollup 方案-StarkNet

文章目录 L2 ZK-Rollup 方案-StarkNet一、StarkWareStarkWare 团队二、什么是StarkNet三、Layer2 扩容项目-对比其他参考L2 ZK-Rollup 方案-StarkNet 一、StarkWare 官网: https://starkware.co/ StarkWare 主要解决了区块链的可扩展性和隐私。 StarkWare 开发了一个完整的…

harmonyOS学习笔记之状态修饰器@state,@prop,@link

State: 1.State装饰的变量拥有其所属组件的状态,可以作为其子组件单向和双向同步的数据源. 当其数值改变时,会引起相关组件的渲染刷新. 2.其声明的变量必须初始化值. Prop: 1.Prop装饰的变量可以和父组件建立单向同步关系. 2.Prop装饰的变量是可变的,但修改不会同步回父组件。.…

2.面向对象编程风格

1. 说明 此博客记录如何以面向对象的方式进行编程&#xff0c;以及如何让线程和线程对象同时销毁 2. 相关代码&#xff1a; 2.1 Thread.h #ifndef _THREAD_H_ #define _THREAD_H_#include <pthread.h>class Thread { public:Thread();virtual ~Thread();void Start()…

el-menu标题过长显示不全问题处理

项目基于vue-element-admin 问题 期望 处理方式 \src\layout\components\Sidebar\index.vue 文件后添加CSS <style scped> /* 侧栏导航菜单经典 文字超长溢出问题 CSS折行 */ .el-submenu__title {display: flex;align-items: center; } .el-submenu__title span {white-…

5个免费实用的AI绘画软件,对新手极其友好!

分享5个实用的AI绘画软件&#xff0c;都可以免费使用&#xff0c;而且操作简单&#xff0c;对新手也比较友好&#xff0c;生成的图片也不错&#xff01; 1、AI-Chat 地址&#xff1a; https://mmm.aiyujiang.com 上传图片并输入AI提示词就能一键生成各类动漫、卡通风格头像&a…

一文让你知道企业真正需要一个怎样的远程协同运维平台?

随着企业业务的快速发展&#xff0c;各类系统也是越来越多&#xff0c;运维工作的作用也就越发突出&#xff0c;运维工作出现一点问题就会牵一发而动全身&#xff0c;所以企业需要一个远程协同运维平台。那企业真正需要一个怎样的远程协同运维平台呢&#xff1f;有空可以看看这…

*p++和(*p)++的区别

*p和(*p)的区别 *和是同优先级操作符&#xff0c;且都是从右至左结合的 ∗ * ∗p&#xff1a;取p所指单元的值&#xff0c;p指向下一单元&#xff0c;即p自加1&#xff0c;然后p指向下一个地址。和 (p)意思一样 (*p)&#xff1a;()的优先级比和都高&#xff0c;所以作用在()内…

多元线性回归(一)

基本概念 线性回归时机器学习中监督学习下的一种算法。回归问题主要关注是因变量&#xff08;需要预测的值&#xff0c;可以是一个也可以是多个&#xff09;和一个或多个值型的自变量&#xff08;预测变量&#xff09;之间的关系。 需要预测的值&#xff1a;即目标变量&#x…