Leetcode 10. 正则表达式匹配

server/2024/10/11 0:24:19/

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/server/129864.html

相关文章

ElementUI 2.x 输入框回车后在调用接口进行远程搜索功能

输入框回车后在调用接口进行远程搜索功能 主要思路 默认的远程搜索会在输入框聚焦的时候就展示下拉弹窗&#xff0c;而我们需要的是在回车之后才展示下拉弹窗。 具体代码 <divv-for"(domain, index) in formData.domains"class"dynamic-input":key&…

【笔记】微分方程

一、微分方程的基本概念: 定义: 微分方程是一个包含未知函数及其一个或多个导数的方程。 阶: 微分方程的阶是指方程中出现的最高阶导数。 线性与非线性: 如果未知函数及其导数都是一次方的,则称为线性微分方程;否则为非线性微分方程。 常微分方程(ODE)与偏微分方程(PDE): 常…

k8s 中存储之 PV 持久卷 与 PVC 持久卷申请

目录 1 PV 与 PVC 介绍 1.1 PersistentVolume&#xff08;持久卷&#xff0c;简称PV&#xff09; 1.2 PersistentVolumeClaim&#xff08;持久卷声明&#xff0c;简称PVC&#xff09; 1.3 使用了PV和PVC之后&#xff0c;工作可以得到进一步的细分&#xff1a; 2 持久卷实验配置…

VAS1800Q奇力科技线性芯片电荷泵热处理

高效恒流LED驱动器——VAS1800Q在汽车应用中的卓越表现 VAS1800Q是一款专为汽车应用设计的高效恒流LED驱动器。它具备多个显著特点&#xff0c;不仅提升了LED驱动效率&#xff0c;还大大减少了热量的产生&#xff0c;使其在汽车照明领域中具有极高的应用价值。本文将详细介绍VA…

QT学习笔记3.1(建立项目、执行_建立第一个工程)

QT学习笔记3.1&#xff08;建立项目、执行_建立第一个工程) 建立第一个工程&#xff0c;使用widget模板 使用的版本是 Qt Creator 4.11.0 Based on Qt 5.14.0 (MSVC 2017, 32 bit) 1.选择Application-》QT Widget Application&#xff08;最常使用&#xff09; 2.项目保存位…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-03

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-03 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-03目录1. A Scalable Data-Driven Framework for Systematic Analysis of SEC 10-K Filings Using Large Language Models摘要研…

5G NR coreset 简介

文章目录 5G 为何引入CORESETCORESET介绍CORESET 分类 5G 为何引入CORESET 在LTE系统中&#xff0c;PDCCH频域占据整个带宽&#xff0c;始于占据每个RB的前1~3个OFDM 符号&#xff0c;这种情况下&#xff0c;UE 只需知道PDCCH 所占据的OFDM 符号数&#xff0c;就可以确定PDCCH…

【韩顺平Java笔记】第8章:面向对象编程(中级部分)【297-313】

文章目录 297. super基本语法297.1 基本介绍297.2 基本语法 298. super使用细节1299. super使用细节2300. super使用细节3301. 方法重写介绍302. 方法重写细节303. 重写课堂练习1304. 重写课堂练习2输出结果&#xff1a; 姓名&#xff1a;田所浩二 年龄:24305. 养宠物引出多态3…