Leetcode 10. 正则表达式匹配

news/2024/10/9 1:51:30/

1.题目基本信息

1.1.题目描述

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

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

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

1.2.题目地址

https://leetcode.cn/problems/regular-expression-matching/description/

2.解题方法

2.1.解题思路

动态规划

2.2.解题步骤

在这里插入图片描述

第一步,状态定义;dp[i][j]为s的前i个字符串和p的前j个字符串是否匹配

第二步,状态初始化。初始化当匹配字符串为空时的匹配状态(即j=0时的状态),因为除了原字符串为空时,dp[0][0]=True,其余的情况下dp[x][0]=False,所以只需要初始化dp[0][0]=True即可

第三步,状态转移。当判断前i个字符和前j个匹配字符是否匹配时,这里先预先定义俩字符匹配为匹配字符为.或者匹配字符和原字符两者相等。

  • 如果最后一个匹配字符为号,并且倒数第二个匹配字符和原字符串最后一个字符匹配,可以选择让匹配一次,去除当前s子串中匹配的部分,此时的状态转移为dp[i][j]=dp[i-1][j],当选择让*匹配0个,则去除匹配子串中的x*组合,此时状态转移为dp[i][j]=dp[i][j-2];
  • 如果最后一个匹配字符为*,并且倒数第二个匹配字符和原字符串最后一个字符不匹配,则只能选择让*匹配0次,此时dp[i][j]=dp[i][j-2];
  • 如果最后一个匹配字符不为*号,并且该匹配字符与原字符串中最后一个字符匹配,此时的转移方程为dp[i][j]=dp[i-1][j-1];
  • 如果最后一个匹配字符不为*号,并且该匹配字符与原字符串最后一个字符不匹配,则当前的原字符串和匹配字符串一定无法匹配,即dp[i][j]=False。

经过遍历,最终的dp[sLen][pLen]即为题解

3.解题代码

Python代码

class Solution:def isMatch(self, s: str, p: str) -> bool:sLen,pLen=len(s),len(p)# 第一步,状态定义;dp[i][j]为s的前i个字符串和p的前j个字符串是否匹配dp=[[False]*(pLen+1) for i in range(sLen+1)]# 第二步,状态初始化。初始化当匹配字符串为空时的匹配状态(即j=0时的状态),因为除了原字符串为空时,dp[0][0]=True,其余的情况下dp[x][0]=False,所以只需要初始化dp[0][0]=True即可dp[0][0]=True   # 两个都是空字符串时,匹配# 第三步,状态转移。当判断前i个字符和前j个匹配字符是否匹配时,这里先预先定义俩字符匹配为匹配字符为.或者匹配字符和原字符两者相等。如果最后一个匹配字符为*号,并且倒数第二个匹配字符和原字符串最后一个字符匹配,可以选择让*匹配一次,去除当前s子串中匹配的部分,此时的状态转移为dp[i][j]=dp[i-1][j],当选择让*匹配0个,则去除匹配子串中的x*组合,此时状态转移为dp[i][j]=dp[i][j-2];如果最后一个匹配字符为*,并且倒数第二个匹配字符和原字符串最后一个字符不匹配,则只能选择让*匹配0次,此时dp[i][j]=dp[i][j-2];如果最后一个匹配字符不为*号,并且该匹配字符与原字符串中最后一个字符匹配,此时的转移方程为dp[i][j]=dp[i-1][j-1];如果最后一个匹配字符不为*号,并且该匹配字符与原字符串最后一个字符不匹配,则当前的原字符串和匹配字符串一定无法匹配,即dp[i][j]=False。经过遍历,最终的dp[sLen][pLen]即为题解# > 判断s[i]字符和p的p[j]字符是否匹配def match(i,j):if i<0 or j<0:return Falseif p[j]==".":return Trueelif p[j]==s[i]:return Trueelse:return Falsefor i in range(sLen+1):for j in range(1,pLen+1):if p[j-1]!="*":if match(i-1,j-1):dp[i][j]=dp[i-1][j-1]else:dp[i][j]=Falseelse:if match(i-1,j-2):dp[i][j]=dp[i-1][j] or dp[i][j-2]else:dp[i][j]=dp[i][j-2]# print(dp[sLen][pLen])return dp[sLen][pLen]

C++代码

class Solution {
public:bool match(int i,int j,string s,string p){if(i<0 || j<0){return false;}if(p[j]=='.'){return true;}else if(p[j]==s[i]){return true;}else{return false;}}bool isMatch(string s, string p) {int sLen=s.size(),pLen=p.size();vector<vector<bool>> dp(sLen+1,vector<bool>(pLen+1,false));dp[0][0]=true;for(int i=0;i<sLen+1;++i){for(int j=1;j<pLen+1;++j){if(p[j-1]!='*'){if(match(i-1,j-1,s,p)){dp[i][j]=dp[i-1][j-1];}else{dp[i][j]=false;}}else{if(match(i-1,j-2,s,p)){dp[i][j]=dp[i-1][j] || dp[i][j-2];}else{dp[i][j]=dp[i][j-2];}}}}return dp[sLen][pLen];}
};

4.执行结果

在这里插入图片描述


http://www.ppmy.cn/news/1536407.html

相关文章

深入解析 NoSQL 数据库的分类与特点

目录 NoSQL 数据库概述NoSQL 数据库的主要分类 2.1 键值存储2.2 文档存储2.3 列族存储2.4 图数据库 NoSQL 数据库的特点NoSQL 数据库的应用场景NoSQL 数据库的优缺点总结 NoSQL 数据库概述 NoSQL 数据库是一种非关系型数据库&#xff0c;旨在应对大规模数据存储和处理的挑战…

02_InFluxDb

InFluxDb 初始化初始化流程 交互InFluxDbWebUI交互 数据模型行协议添加标签数据格式 数据类型空格索引 初始化 初始化流程 用户 密码 组织名称 Bucket—mysql里面的数据库概念 交互InFluxDb 暂用了8086端口.提供了 http api WebUI交互 略... 数据模型 这是mysql里面的表…

Semantic Communications With AI Tasks——面向图像分类任务的语义传输系统

论文链接&#xff1a; 2109.14170 (arxiv.org)https://arxiv.org/pdf/2109.14170 1. 背景 无线网络从“万物互联”向“智能互联”转变的范式变化&#xff0c;这与香农和韦弗关于通信演变的预言相一致。传统的无线网络侧重于信号的准确传输&#xff08;技术层面&#xff09;&…

如何在 Kali Linux 上安装 Google Chrome 浏览器

如何在 Kali Linux 上安装 Google Chrome 浏览器 Google Chrome 是最流行的网络浏览器之一&#xff0c;可在许多不同的设备上使用。它也可以在 Kali Linux 上运行&#xff0c;尽管 Mozilla Firefox 是默认的 Web 浏览器并且随发行版预装。 在 Kali 上安装 Google Chrome 非常…

JSON 全知全解:深入探索 JSON 的奥秘

目录 一、JSON 基础认知&#xff08;一&#xff09;JSON 的定义与历史&#xff08;二&#xff09;JSON 的语法规则&#xff08;三&#xff09;JSON 与 JS 对象的关系 二、JSON 在不同语言中的用法&#xff08;一&#xff09;JavaScript 中的 JSON 操作&#xff08;二&#xff0…

PHP变量(第④篇)

本栏目教学是php零基础到精通&#xff0c;如果你还没有安装php开发工具请查看下方链接&#xff1a; Vscode、小皮面板安装-CSDN博客 今天来讲一讲php中的变量&#xff0c;变量是用于存储信息的"容器"&#xff0c;这些数据可以在程序执行期间被修改&#xff08;即其…

【Docker】配置文件

问题 学习Docker期间会涉及到docker的很多配置文件&#xff0c;可能会涉及到的会有&#xff1a; /usr/lib/systemd/system/docker.service 【docker用于被systemd管理的配置文件】 /etc/systemd/system/docker.service.d【覆盖配置文件的存放处】 /etc/systemd/system/mul…

DFT ATPG coverage 详解

1. **定义** - **DFT (Design for Testability)**&#xff1a;可测试性设计是一种在芯片设计阶段就考虑如何提高芯片可测试性的方法。通过在设计中插入特定的测试结构&#xff0c;如扫描链、内建自测试&#xff08;BIST&#xff09;电路等&#xff0c;使得芯片在制造出来后能…