python实现正则表达式匹配

Leetcode刷题笔记 专栏收录该内容
26 篇文章 1 订阅

题目描述

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

. 匹配任意单个字符
* 匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖整个字符串 s的,而不是部分字符串。
LeetCode原题地址:https://leetcode-cn.com/problems/regular-expression-matching/

测试用例

  • 示例 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 = “cab”
输出:true
解释:因为 ‘*’ 表示零个或多个,这里 ‘c’ 为 0 个, ‘a’ 被重复一次。因此可以匹配字符串 “aab”。

  • 示例 5

输入:s = “mississippi” p = “misisp*.”
输出:false

提示:

0 <= s.length <= 20
0 <= p.length <= 30
s 可能为空,且只包含从 a-z 的小写字母。
p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。
保证每次出现字符 * 时,前面都匹配到有效的字符

代码实现

将正则表达式匹配过程转换为动态规划问题

class Solution:
    def isMatch(self, s: str, p: str) -> bool:
        """实现正则匹配符.*的功能(.表示任意字符,*表示匹配0到多次)
        :param s:待匹配的字符串
        :param p:正则表达式
        :return:
        """

        def match(i,j):
            if i == 0:
                return False
            if p[j-1] == ".":
                return True
            return s[i-1] == p[j-1]

        m,n = len(s),len(p)
        #在初始化匹配list的时候,增加了一行一列
        #相当于在s和p的前面增加了一个空字符,简化后面的边界处理问题
        match_list = [[False]*(n+1) for _ in range(m+1)]
        #s和p的第一个字符匹配
        match_list[0][0] = True
        for i in range(m+1):
            for j in range(1,n+1):
                #这里是j-1主要是因为与p的字符长度进行匹配
                #因为前面为p增加了一个空字符
                if p[j-1] == "*":
                    #当第j个字符为*时,分两种情况
                    #第一种假设字符i和j-1不相等的情况下,我们就直接使用j-2的匹配结果
                    match_list[i][j] |= match_list[i][j-2]
                    #如果i和j-1相匹配,我们结合两个生成最终结果
                    if match(i,j-1):
                        match_list[i][j] |= match_list[i-1][j]
                else:
                    #如果i和j相匹配,就使用i-1和j-1的匹配结果
                    if match(i,j):
                        match_list[i][j] |= match_list[i-1][j-1]
        return match_list[m][n]


solution = Solution()
s = "aab"
p = "c*a*b"
print(solution.isMatch(s,p))

参考:

  1. LeetCode详细题解
  • 0
    点赞
  • 0
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页

打赏

修炼之路

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值