Python LeetCode 10正则表达式

LeetCode题解:10.正则表达式匹配【Python题解超详细,动态规划法、正则匹配法】 LeetCode题解:10.正则表达式匹配【Python题解超详细,动态规划法、正则匹配法】,动态规划——初始化与状态转移方程。 正则表达式匹配:给你一个字符串s和一个字符规律p,请你来实现一个支持'.'和'*'的正则表达式匹配。'.'匹配任意单个字符;'*'匹配零个或多个前面的那一个元素。所谓匹配,是要涵盖整个字符串s的,而不是部分字符串。 阅读详情

第一版:p的2各字符一组匹配,分析.,x状况

"""
10. 正则表达式匹配
给你一个字符串 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
解释:".*" 表示可匹配零个或多个('*')任意字符('.')。
示例 4:

输入:s = "aab" p = "c*a*b"
输出:true
解释:因为 '*' 表示零个或多个,这里 'c' 为 0 个, 'a' 被重复一次。因此可以匹配字符串 "aab"。
示例 5:

输入:s = "mississippi" p = "mis*is*p*."
输出:false

"""
#踩了无数坑的正则表达式:1)合并同类a* a*;  否则一旦最终是匹配错误的会不停循环出无数组合(a*爆发而非收敛)
# #                    2)剩余长度:s=p=0成功; s=0,p!=0 看是否剩余了x*; 不剩余x*,或者s!=,p=0 (sp=0)全错
                      # 3)正式匹配: 字母+'*' (字母不能配上,字母能配上),.+'*', '.'开头,普通开头

class Solution:
    def isMatch(self, s: str, p: str) -> bool:
        if len(p) == 0 and len(s) == 0:
            return True  # 截止条件之一,同时匹配空掉了

        if len(p) == 1:
            # return True if s == p else False
            if p != '.':
                return True if s == p else False
            else:
                return True if len(s) == 1 else False

        if len(p) >= 2 and p[1] == '*' and len(s) == 0:
            return self.isMatch(s, p[2:])

        if len(p) * len(s) == 0:
            return False  # 两个只有1个为0,错误

        # 多个同类的 a*a*a*相当于1个
        if len(p) >= 4 and p[0] == p[2] and p[1] == '*' and p[3] == '*':
            return self.isMatch(s, p[2:])

        if s[0:2] == p[0:2]:  # 2个字符为单位进行递归,尽量每次去掉一个字符
            return self.isMatch(s[1:], p[1:])
        elif p[0] == '.' and p[1] == '*':  # 最强组合.*,匹配任意字符串(只要没有猪队友)
            return self.isMatch(s, p[2:]) or self.isMatch(s[1:], p[2:]) or self.isMatch(s[1:], p)
            # 匹配0个,1个,1+个
        elif p[0] == '.':
            print(s[0:], s[0] + p[1:])
            return self.isMatch(s[0:], s[0] + p[1:])  # 开头.,替换成s对应的字符
        elif s[0] != p[0] and p[1] == '*':
            return self.isMatch(s, p[2:])
        # elif s[0] == p[0] and p[1] == '.' and len(s) > 1:
        #     return self.isMatch(s[1:], s[1] + p[2:]) or self.isMatch(s[1:], p[1:]) #保留.用作.*结构的强匹配
        elif s[0] == p[0] and p[1] == '*':
            return self.isMatch(s, p[2:]) or self.isMatch(s[1:], p[2:]) or self.isMatch(s[1:], p)
            # 配0个,*匹配1个(原始a*对应a),匹配1+个(对应aa*)(+1个是可以反复递归的,一直递归到s中再没有匹配的p[0]为止)
            # self.isMatch(s[1:], p)
        elif s[0] == p[0]:  # 得过且过,过完这个,下一个也许会出现x*结构 #and s[1] != p[1]
            return self.isMatch(s[1:], p[1:])
        else:
            return False

第二版:只看p的第二个符号做分支选择

稍微改进:合并同类的逻辑判断:
class Solution:
    def isMatch(self, s: str, p: str) -> bool:
        if len(p)==0 and len(s) == 0:
            return True #截止条件之一,同时匹配空掉了
        
        if len(p) == 1:
            #return True if s == p else False
            if p != '.':
                return True if s == p else False
            else:
                return True if len(s) == 1 else False

        if len(s) == 0 and p[1] == '*':
            return self.isMatch(s, p[2:])

        if len(s) * len(p) == 0:
            print(1)
            return False

        #合并同类 x*,防止匹配膨胀,太过贪婪
        if len(p) > 3 and p[1] == '*' and p[0:2] == p[2:4]:
            return self.isMatch(s, p[2:])


        if p[1] == '*' and p[0] == '.':
            return self.isMatch(s, p[2:])  or self.isMatch(s[1:], p) # self.isMatch(s[1:], p[2:]) or /
        elif p[1] == '*' and p[0] == s[0]:
            return self.isMatch(s, p[2:]) or self.isMatch(s[1:], p)
        elif p[1] == '*' and p[0] != s[0]:
            return self.isMatch(s, p[2:])
        elif p[0] == '.':
            return self.isMatch(s[1:], p[1:])
        elif p[0] == s[0]:
            return self.isMatch(s[1:], p[1:])
        else:
            # print(2, s, p)
            return False

代码简化了,逻辑上复杂在预先判断剩余长度0、长度1的状况

第三版:大神版,利用len(s) p[0]in大为简化判断

  • 递归的很溜溜溜
  • 注意合并同类(a* a* a* a*)等,否者重复递归浪费大量循环试错
class Solution:
    def isMatch(self, s: str, p: str) -> bool:
        if len(p) == 0:
            #print(s, not s)
            return not s

        match = (len(s) > 0) and (p[0] in [s[0], '.'])

        if len(p) > 3 and p[1] == '*' and p[0:2] == p[2:4]: #合并同类的a*加速明显(避免多轮重复迭代)15504ms减少到88ms
            return self.isMatch(s, p[2:])

        if len(p) > 1 and p[1] == '*':
            #print(match, s, p, ' match ', s and (p[0] in [s[0], '.']))
            return self.isMatch(s, p[2:]) or (match and self.isMatch(s[1:], p))  #match and  配0并不一样要配上;

        #print(match)
        return match and self.isMatch(s[1:], p[1:])
python【力扣LeetCode算法题库】10-正则表达式匹配 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。 ‘.’ 匹配任意单个字符 ‘*’ 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。 说明: s 可能为空,且只包含从 a-z 的小写字母。 p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。 示例 1: 输入: s = “aa” p = “... 阅读详情

相关推荐

LeetCode 每日一题 #10:正则表达式匹配|Python

几年前我准备求职时,也曾一头扎进 LeetCode 的题海。从最初的“看题懵圈”到后来能在面试中从容写出最优解,成了我提升算法能力最有效的方式。那段经历不仅帮我顺利拿到心仪 offer,更让我养成了系统思考和高效编码的习惯。如今工作稳定了,终于有时间把当年的刷题笔记重新整理、优化,并用逐题讲解清楚。希望能帮助正在准备面试、转行或想夯实基础的你——。:动态规划、正则表达式、字符串匹配、状态转移:困难(但 DP 思路经典):⭐⭐⭐⭐⭐(大厂高频 DP 题,考察抽象建模能力)

张三的博客 1019

python中是用tab还是空格_详解Python中正则匹配TAB及空格的小技巧

在正则中,使用.*可以匹配所有字符,其中.代表除\n外的任意字符,*代表0-无穷个,比如说要分别匹配某个目录下的子目录:>>> import re>>> match = re.match(r"/(.*)/(.*)/(.*)/", "/usr/local/bin/")>>> match.groups()('usr', 'local', 'bin')>>>比如像上面,使用(.*)就能很好的匹配,但如果...

weixin_39853210的博客 194

【深度学习3】ubuntu22.04从零开始搭建深度学习环境

ubuntu22.04从零开始搭建深度学习开发环境

weixin_43387635的博客 1万+

Python字符串

Python字符串Python capitalize()方法Python center()方法Python count()方法Python decode()方法Python encode()方法Python endswith()方法Python expandtabs()方法Python find()方法 Python capitalize()方法 描述: Python capitalize()将字...

bangbnag的博客 718

通信原理与MATLAB(八):2PSK的调制解调

通信原理和MATLAB

菜yuan~的博客 3万+

STM32F103 CAN通信避坑指南:从标准库配置到收发测试的完整流程

本文详细介绍了STM32F103 CAN通信的实现流程,从标准库配置到收发测试,帮助开发者避开常见陷阱。内容涵盖硬件连接、波特率计算、过滤器配置及错误处理等关键环节,提供实用的代码示例和调试技巧,确保CAN通信的稳定性和可靠性。

weixin_30627341的博客 324

python 去掉tab_python为什么不用tab

Python最具特色的是用缩进来标明成块的代码。我下面以if选择结构来举例。if后面跟随条件,如果条件成立,则执行归属于if的一个代码块。在Python中,缩进是这样的ifi>0:x=1y=2在Python中, 去掉了i > 0周围的括号,去除了每个语句句尾的分号,表示块的花括号也消失了。多出来了if ...之后的:(冒号), 还有就是x = 1 和 y =2前面有四个空...

weixin_39520204的博客 457

永磁同步电机定子槽型设计实战:从梨形槽到矩形槽的NVH优化之路

本文深入探讨了永磁同步电机定子槽型设计在NVH优化中的关键作用,对比了梨形槽与矩形槽的性能差异。通过Ansys Maxwell仿真和实际案例,揭示了矩形槽在提升槽满率、降低电磁噪声方面的优势,并总结了五大设计黄金法则,为电机设计工程师提供了实用指导。

weixin_28740299的博客 493

python空格键怎样表示_Python 基本知识点(一)

1.Python中的输出用print( )函数, 从外部获取数据用input( )函数2 Python 中的数据类型有 int 整数型, string字符串, float浮点类型, list 列表类型,dict字典类型,tuple元祖类型, set集合等,其中List和dict是使用最多的 .其中判断一个类似是否为元组类型,主要看括号里面是否有逗号“,”3 代码缩进,4个空格一层,注意千...

weixin_33463850的博客 8136

基于CY7C68013A芯片的USB2.0设计

基于FPGA的USB2.0读写控制项目简介CY7C68013A芯片介绍CY7C68013A芯片读写时序控制CY7C68013A芯片读写代码USB2.0的测试结果结束语 项目简介 我们前面已经写过了USB3.0的FPGA实现,所用到的芯片是FX600Q芯片,这次我们讲解USB2.0的FPGA代码的编写。我们用到的芯片是Cypress厂家的Cy7C68013A,该款芯片在市场上的应用率极广,我们这里不...

zhangningning1996的博客 1万+

Django 小实例S1 简易学生选课管理系统 —— 〇、初步介绍与演示

python Django实现的一个简易的教务选课系统。 介绍与演示的视频版本已发到我的b站: https://www.bilibili.com/video/BV1er4y1w7ty。 项目已上传到我的github: https://github.com/BigShuang/SimpleStudentCourseManagementSystem。 S1总目录: 〇、初步介绍与演示 一、项目流程梳理与数据库设计 ======================= 大爽歌作,made by big shuang.

大爽老师的博客 5944

第二章 Python基础

2.1良好的代码格式 一.注释 单行注释:以“#”开头,用于说明当前行或之后代码的功能。单行注释既可以单独占一行,也可以位于标识的代码之后,与标识的代码共占一行。 # 第一个注释 print (“Hello, Python!”) # 第二个注释 多行注释:是由三对双引号或单引号包裹的语句,主要用于说明函数或类的功能 """ print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False) """ 二. 缩进 Pytho.

xiaoma1245379的博客 1940

Cursor集成Claude 4.6免费版:本地IDE合规调用指南

大语言模型编程助手(LLM Copilot)已成为现代开发标配,其核心能力依赖于上下文理解、代码推理与结构化输出等关键技术原理。Anthropic官方提供的Claude系列模型,尤其Claude 4.6,凭借200K超长上下文、tool use函数调用和严格可控的API设计,在工程实践中展现出显著技术价值。该能力可无缝嵌入本地IDE环境,支撑代码解释、跨文件分析、单元测试生成等高频开发场景。本文聚焦Cursor这一开源可审计IDE,详解如何合规复用Anthropic免费tier接口(/v1/messages

weixin_34095889的博客 537

力扣(LeetCode 10)正则表达式 python

题目 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。 ‘.’ 匹配任意单个字符 ‘*’ 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。 说明: s 可能为空,且只包含从 a-z 的小写...

qq_41318002的博客 509

基于集成运放心电放大器设计(原创)

原创作者:einyboy or alert 最近在看美剧《危机边缘》关于边缘科学的案件,科技控可以看一下,但建议不在吃东西的时候看。想像力是创造的思想源头,动手能力则是创造的车床。 自认为是没有想像力的那类,只能发挥动手能力了。 心电测量简介 图1 心电极接线图 如图1心电测试一般使用3个心电极进行测量,各个电极的说明如下: RA: Right Arm缩写,右手电极 LA: L...

huandaohack的专栏 6924

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

力扣Leetcode:10. 正则表达式匹配(Python)

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

乔卿的博客 1637

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

leetcode10. 正则表达式匹配(Python3)

leetcode10. 正则表达式匹配 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。 '.' 匹配任意单个字符 '*' 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。 说明: s 可能为空,且只包含从 a-z 的小写字母。 p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。 示例 1: 输入: s = "aa" p = "a" 输出: false 解释: "a" 无法匹配 "aa" 整个

weixin_43422466的博客 470

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

LeetCode 10. 正则表达式匹配 | Python

使用暴力解的形式,理清题目的难点,进而使用动态规划加备忘录的形式来进一步降低复杂度,更高效的解决《10. 正则表达式匹配》问题

"大梦三千秋的博客 1590

【PythonCode】力扣Leetcode6~10题Python版

Leetcode6-10

weixin_43790276的博客 1859

leetcode 10 正则表达式匹配(python)

leetcode 10 正则表达式匹配(python) 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。 ‘.’ 匹配任意单个字符 ‘*’ 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。 说明: s 可能为空,且只包含从 a-z 的小写字母。 p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和...

leetcode 10 正则表达式匹配(python) 252

LeetCode-Python-10. 正则表达式匹配

给你一个字符串s和一个字符规律p,请你来实现一个支持'.'和'*'的正则表达式匹配。 '.' 匹配任意单个字符 '*' 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖整个字符串s的,而不是部分字符串。 说明: s可能为空,且只包含从a-z的小写字母。 p可能为空,且只包含从a-z的小写字母,以及字符.和*。 示例 1: 输入: s = "...

Keep Coding 3481

LeetCode 10 正则表达式匹配 python实现

题目:给定一个字符串 (s) 和一个字符模式 §。实现支持 ‘.’ 和 ‘*’ 的正则表达式匹配。 ‘.’ 匹配任意单个字符。 ‘*’ 匹配零个或多个前面的元素。 匹配应该覆盖整个字符串 (s) ,而不是部分字符串。 说明: s 可能为空,且只包含从 a-z 的小写字母。 p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。 示例 1: 输入: s = "aa" p = "a" 输...

R18830287035的博客 331

LeetCode Python - 10.正则表达式匹配

给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。在这里前面的元素就是 ‘a’。因此,字符串 “aa” 可被视为 ‘a’ 重复了一次。解释:因为 ‘*’ 代表可以匹配零个或多个前面的那一个元素,” 表示可匹配零个或多个(‘*’)任意字符(‘.’)。解释:“a” 无法匹配 “aa” 整个字符串。输入:s = “aa”, p = “a*”输入:s = “aa”, p = “a”‘*’ 匹配零个或多个前面的那一个元素。输入:s = “ab”, p = “.

xuxu96 598

LeetCode 10. Regular Expression Matching [正则表达式匹配] Python3

LeetCode 10. Regular Expression Matching [正则表达式匹配] Python3 Description 点击查看题目 Given an input string (s) and a pattern (p), implement regular expression matching with support for '.' and '*'. ‘.’ Match...

与你的博客 276

LeetCode10 正则表达式匹配 python3

昨天‘山竹’来Hong Kong 忙于抗台 没更新(其实偷懒了) 给定一个字符串 (s) 和一个字符模式 (p)。实现支持 ‘.’ 和 ‘*’ 的正则表达式匹配。 ‘.’ 匹配任意单个字符。 ‘*’ 匹配零个或多个前面的元素。 匹配应该覆盖整个字符串 (s) ,而不是部分字符串。 说明: s 可能为空,且只包含从 a-z 的小写字母。 p 可能为空,且只包含从 a-z 的...

Victordas的技术笔记 1085

Python描述 LeetCode 10. 正则表达式匹配

给你一个字符串 和一个字符规律 ,请你来实现一个支持 和 的正则表达式匹配。所谓匹配,是要涵盖 整个 字符串 的,而不是部分字符串。示例 1: 示例 2: 示例 3: 提示:动态规划。状态转移:...

一起加油 303
上一篇: Python高级操作第一弹:heapq的妙用
下一篇: 平衡线共模抑制原理和距离
飞凡可期
博客等级 码龄11年 34粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值