LeetCode-10. 正则表达式匹配

LeetCode-10. 正则表达式匹配

    • 问题分析
    • 算法描述
    • 程序代码
      • C++
      • Go

问题分析

这道题的难点主要在于*号的匹配,这里记dp[i][j]表示s[1...i]p[1...j]能否完成匹配,先根据特殊情况归纳总结:

  • *号匹配 0 次,则dp[i][j] = dp[i][j-2]
  • *号匹配 1 次,则dp[i][j] = dp[i-1][j-2] && s[i] == p[j-1]
  • *号匹配 2 次,则dp[i][j] = dp[i-2][j-2] && s[i-1] == p[j-1] && s[i] == p[j-1]
  • *号匹配 3 次,则dp[i][j] = dp[i-3][j-2] && ...
  • *号匹配 k 次,则dp[i][j] = dp[i-k][j-2] && ...

对上述进行归纳可得:

  • k = 0时,dp[i][j] = dp[i][j-2]
  • k >= 1时,dp[i][j] = dp[i][j-2]带入等式左边,可得dp[i][j-2] = dp[i-k][j-2] && ...。因此,最终化简可得dp[i][j] = dp[i-1][j] && s[i] == p[j-1]

算法描述

状态定义dp[i][j]表示s[1...i]p[1...j]能否完成匹配

状态转移
p[j] == '*',可能的状态转移如下:

  • *表示匹配 0 个前面的那一个元素:dp[i][j] = dp[i][j-2]
  • *表示匹配多个前面的那一个元素:dp[i][j] = (s[i] == p[j-1] || p[j-1] == '.') && dp[i-1][j]
    p[j] != '*',则只能进行单元素的匹配:dp[i][j] = (s[i] == p[j] || p[j] == '.') && dp[i-1][j-1]

边界情况

  • dp[0][0] = true
  • 子字符规律p[1...i]可能匹配空字符串sdp[0][i] = p[i] == '*' && dp[0][i-2]

程序代码

C++

class Solution {
public:bool isMatch(string s, string p) {int m = s.size(), n = p.size();s = " " + s;p = " " + p;vector<vector<bool>> dp(m + 1, vector<bool>(n + 1, false));// 初始化dp[0][0] = true;for(int i = 2; i <= n; i++)  dp[0][i] = p[i] == '*' && dp[0][i-2];for(int i = 1; i <= m; i++) {for(int j = 1; j <= n; j++) {if(p[j] == '*') {dp[i][j] = dp[i][j-2] || (s[i] == p[j-1] || p[j-1] == '.') && dp[i-1][j];}else {dp[i][j] = (s[i] == p[j] || p[j] == '.') && dp[i-1][j-1];}}}return dp[m][n];}
};

Go

func isMatch(s string, p string) bool {m, n := len(s), len(p)s = " " + sp = " " + pdp := make([][]bool, m + 1)for i := 0; i < len(dp); i++ {dp[i] = make([]bool, n + 1)}// 初始化dp[0][0] = truefor i := 2; i <= n; i++ {dp[0][i] = dp[0][i-2] && p[i] == '*'}for i := 1; i <= m; i++ {for j := 1; j <= n; j++ {if p[j] == '*' {dp[i][j] = dp[i][j-2] || dp[i-1][j] && (s[i] == p[j-1] || p[j-1] == '.')} else {dp[i][j] = dp[i-1][j-1] && (s[i] == p[j] || p[j] == '.')}}}return dp[m][n]
}

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

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

相关文章

Mybatis源码解析4:获取Session、Mapper

Mybatis源码解析4&#xff1a;获取Session、Mapper 1.项目结构2. 源码分析2.1 获取Session DefaultSqlSessionFactory#openSession2.2 获取Mapper DefaultSqlSession#getMapper 1.项目结构 2. 源码分析 2.1 获取Session DefaultSqlSessionFactory#openSession private SqlSe…

利用人工智能算法解决内存垃圾回收问题

内存垃圾回收是计算机领域中的一个重要问题&#xff0c;可以利用人工智能算法解决此问题。常用的人工智能算法包括遗传算法、模拟退火算法、禁忌搜索算法等。 其中&#xff0c;遗传算法是一种基于自然选择和遗传进化的算法&#xff0c;可以用于优化问题。在内存垃圾回收中&…

Python实战演练之Python实现一个简单的天气查询应用

今天&#xff0c;晓白给大家分享Python实现一个简单的天气查询应用&#xff0c;帮助大家获取实时的天气信息&#xff0c;内容仅供学习交流。 首先&#xff0c;我们需要安装一个名为"requests"的Python库&#xff0c;它可以帮助我们发送HTTP请求并获取响应数据。你可…

Kernel(一):基础

本文主要讨论210的kernel基础相关知识。 内核驱动 驱动是内核中的硬件设备管理模块,工作在内核态,程序故障可能导致内核崩溃,程序漏洞会使内核不安全 根文件系统提供根目录,进程存放在根文件系统中,内核启动最后会装载根文件系统 应用程序不属于内核,…

1828_ChibiOS中的对象FIFO

全部学习汇总&#xff1a; GreyZhang/g_ChibiOS: I found a new RTOS called ChibiOS and it seems interesting! (github.com) 1. 最初的这个理解&#xff0c;当看到后面之后就知道有点偏差了。其实&#xff0c;这个传输就是一个单纯的FIFO而不是两个FIFO之间的什么操作。 2.…

去掉参数中第一个“,”

记录一下&#xff0c;前端传参中&#xff0c;传给我参数是“categoryIds: ,1731557494586241026,1731569816263311362,1731569855534579713,1731858335179223042,1731858366821052418” 但是后端&#xff0c;因为我的mybati是in查询&#xff0c;所以因为第一个是“,”。所以会导…

RabbitMQ安装在Linux系统详细教程

安装教程&#xff1a; 1.首先将下载好的文件上传到服务器&#xff0c;拉到opt文件夹中(可以用xftp&#xff09; 2.输入命令&#xff1a; cd /opt 3.安装erlang rpm -ivh erlang-23.3.4.11-1.el7.x86_64.rpm rpm -ivh&#xff08;复制配置文件的名字&#xff09; 4.在Rab…

sap增强

四代增强 2种显示增强1种隐式增强 隐式增强 光标放在增强点或其中的代码点击修改即可修改代码 显示增强 1.ENHANCEMENT-POINT 在代码修改界面选择空行 光标所在位置 可以创建多个增强实施且激活后都会执行. 2.ENHANCEMENT-SECTION 1,选中程序中空行 2.编辑->创建选项 …

回顾2023 亚马逊云科技 re_Invent,创新AI,一路同行

作为全球云计算龙头企业的亚马逊云科技于2023年11月27日至12月1日在美国拉斯维加斯举办了2023 亚马逊云科技 re:Invent&#xff0c;从2012年开始举办的亚马逊云科技 re:Invent 全球大会,到现如今2023 亚马逊云科技 re:Invent&#xff0c;回顾历届re:Invent大会&#xff0c;亚马…

Spring 动态代理时是如何解决循环依赖的?为什么要使用三级缓存?

首先&#xff0c;我将简单介绍一下Spring框架中的动态代理和循环依赖问题。 动态代理与循环依赖 1. 动态代理 在Spring框架中&#xff0c;动态代理是一种常用的技术&#xff0c;用于实现AOP&#xff08;面向切面编程&#xff09;。动态代理允许Spring在运行时为目标对象创建…

C++『异常』

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; C修行之路 &#x1f383;操作环境&#xff1a; Visual Studio 2022 版本 17.6.5 文章目录 &#x1f307;前言&#x1f3d9;️正文1.异常基本概念1.1.C语言异常处理方式1.2.C异常处理方式 2.异常的使用2.1.异常…

在线网页生成工具GrapesJS

项目地址 https://github.com/GrapesJS/grapesjshttps://github.com/GrapesJS/grapesjs 项目简述 这是一个基于node.js的在线网页生成项目&#xff0c;对简化开发有很大的帮助。 主要使用的语言如下&#xff1a; 编辑页面如下&#xff1a; 使用也很简洁 具体可以看下项目。…

使用c++编程语言,将字符串中的数字全部替换成字符串:number

给定一个字符串 s&#xff0c;它包含小写字母和数字字符&#xff0c;请编写一个函数&#xff0c;将字符串中的字母字符保持不变&#xff0c;而将每个数字字符替换为number。 样例输入&#xff1a;a1b2c3 样例输出&#xff1a;anumberbnumbercnumber 代码如下&#xff1a; #incl…

12. MySQL 锁机制

目录 概述 MylSAM引擎 InnoDB引擎 概述 锁是计算机协调多个进程或线程并发访问某一资源的机制&#xff08;避免争抢&#xff09;。在数据库中&#xff0c;除传统的计算资源(如CPU、RAM、I/O等&#xff09;的争用以外&#xff0c;数据也是一种供许多用户共享的资如何保证数据…

Pytest中使用Fixture替换Unittest的Setupclass及Pytest使用装饰器应用参数化

1 类里使用Fixture Pytest中夹具&#xff08;Fixture&#xff09;有几种生命周期&#xff1a;function->model->class->session->packages&#xff0c;其中默认为function。 import pytest from Common.logger import Log from Common.Operator import * fro…

C#中的Attributes特性创建和结合反射应用举例

C#中的特性入门学习 Attributes官方介绍概述 Attributes provide a powerful method of associating metadata, or declarative information, with code (assemblies, types, methods, properties, and so forth). After an attribute is associated with a program entity, …

深入理解Vue.js中的this:解析this关键字及其使用场景

在Vue.js中&#xff0c;this 和 that 可能是指向不同对象的两个变量&#xff0c;或者是在代码中使用时的错误。 this&#xff1a; 在Vue组件中&#xff0c;this 指向当前组件的实例。可以通过 this 访问组件的属性和方法。 例如&#xff0c;在Vue组件的 data 属性中定义了一…

2023年第十届GIAC全球互联网架构大会-核心PPT资料下载

一、峰会简介 谈到一个应用&#xff0c;我们首先考虑的是运行这个应用所需要的系统资源。其次&#xff0c;是关于应用自身的架构模式。最后&#xff0c;还需要从软件工程的不同角度来考虑应用的设计、开发、部署、运维等。架构设计对应用有着深远的影响&#xff0c;它的好坏决…

Leetcode659. 分割数组为连续子序列

Every day a Leetcode 题目来源&#xff1a;659. 分割数组为连续子序列 解法1&#xff1a;哈希 贪心 定义两个哈希表&#xff1a; numsCount&#xff1a;统计数组 nums 中各元素出现次数。tailCount&#xff1a;存储以数字 i 结尾的且符合题意的连续子序列个数。 算法&a…

极兔单号查询,极兔快递物流查询,一键筛选出退回件

批量查询极兔快递单号的物流信息&#xff0c;一键筛选出其中的退回件。 所需工具&#xff1a; 一个【快递批量查询高手】软件 极兔快递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;并登录 步骤2&#xff1a;点击主界面左上角的…