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

新手必看:瑞萨MCU选型时,QFP、QFN、BGA这些封装到底该怎么选?(附选型避坑指南)

本文详细解析了瑞萨MCU选型中QFP、QFN、BGA等封装的特点与适用场景,提供实战避坑指南。通过对比封装的空间占用、散热能力、焊接难度等核心维度,帮助工程师根据具体需求选择最合适的芯片封装,避免因选型不当导致的高成本与生产问题。

weixin_26965807的博客 421

Python字符串

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

bangbnag的博客 718

致远OA公文管理模块相关操作

致远oa协同办公系统 公文管理模板 相关操作

weixin_59666050的博客 4275

头歌平台 操作系统课堂练习2.3:系统调用

使用 gdb 调试内核,跟踪到 main 函数入口的方法与之前实训一样。系统运行时,执行的前 3 个系统调用的编号和名字分别是什么?系统运行时,执行的前 3 个系统调用的编号和名字分别是什么?本关卡使用版本 1 内核进行分析,版本 1 内核文件存放在。为了完成本关任务,你需要:跟踪系统调用的发生。此时,系统调用号存放在寄存器 eax 中。

lazbuyaotoutu的博客 2万+

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

ANSYS MAXWELL内置式永磁同步电机(IPMSM)转矩最大时输入电流相位的确定

1.在转子转速为零时看一个周期内的转矩变化

qq_41752507的博客 6517

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

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

weixin_33463850的博客 8136

富芮坤FR801xH蓝牙协议栈启动流程和notify实现温度数据主动上传

文章目录一、蓝牙协议栈启动流程1.1 初始化代码1.2 初始化流程1.3 回调函数里的初始化二、notify实现2.1 notify介绍2.2 notify实现2.3.1 定义数据2.3.2 获取连接号conidx2.3.3 gatt_notification函数的使用三、notify温度上传测试3.1 蓝牙调试工具3.2 蓝牙调试器设置3.3 测试结果四、参考链接   基于sdk开发的好处是方便项目的快速落地,现在用的是SDK里面的源文件,目前只是学习FR801xH芯片的特性,裁剪这个SDK需要点时间,

weixin_43810563的博客 4319

5G无线关键技术 — 新型传输波形技术和先进编码与调制技术

目录 1、OFDM传输波形技术 2、滤波器组多载波 (Filterbank multicarrier:FBMC) 3、先进编码与调制技术 4、空间调制(Spatial Modulation SM) 5、频率正交幅度调制 1、OFDM传输波形技术 OFDM是当前Wi-Fi和LTE标准中的高速无线通信的主要传信模式。 LTECP配置 子载波间隔 CP长度Tcp 有用符号长度Tu CP比例..

Fanjufei的博客 2128

第二章 Python基础

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

xiaoma1245379的博客 1940

黑猫带你学eMMC协议第12篇:生产状态感知(PSA)

1 概述 1.1 什么是PSA Production State Awareness (PSA) 生产状态感知 e•MMC设备可以利用其是否在生产环境中的信息,从而在现场运作时进行不同的操作。 例如,在设备低温焊接(soldering)前,将数据写入emmc,可能导致数据出错,而正在焊接期间写入数据,出错的概率可能会更大。在低温焊接之前,emmc设备可以使用一种特定的内部操作去加载内容,这样就能减少数据出错的概率,而在低温焊接后进行常规的操作就行了。 1.2 psa如何进行工作? PSA存在于emmc5.0

黑猫奥利奥的博客 4260

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

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

qq_41318002的博客 509

1.14、基于NARX神经网络的磁悬浮建模(matlab)

数据准备:首先,需要准备用于训练和测试的磁悬浮系统的输入和输出数据,包括磁力、电流、位置、速度等信息。数据可以被保存在MATLAB的数据文件中,并加载到工作空间中。使用MATLAB的神经网络工具箱,创建一个NARX神经网络。需要定义网络的层次结构、节点数、激活函数等参数。通常,NARX网络包括自回归层和外部输入层。数据预处理:对加载的数据进行预处理,包括去除噪声、归一化处理等操作,以确保数据质量和网络训练的稳定性。使用MATLAB的训练函数,如trainlm或者trainbr,对NARX神经网络进行训练。

XU157303764的博客 1998

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

力扣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

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

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、付费专栏及课程。

余额充值