剑指offer 19.正则表达式匹配 Python解法

题目描述:

正则表达式
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。
'.' 匹配任意单个字符
'*' 匹配零个或多个前面的那一个元素

所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。
说明:
s 可能为空,且只包含从 a-z 的小写字母。
p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。

 

分析:

这题看起来就很绕人,书上写的分析很乱。总结一个能理解清楚的解法。如:s=aaa,p=a*aaa

首先第一个字母要匹配:要么同为字母a,要么p[0]=.

然后分为两种情况:p[1]是否为*

当*出现时,一定会在前面跟一个其他字符,所以一定会出现在p[1]的位置。会有两种情况:
一种情况是我们忽略a*这两个字符,因为可以出现0次;另一种情况是匹配上这个字符,用递归的方式匹配下一个。

一定要用f_match = bool(s),否则结果可能输出''

def isMatch( s, p):
    if not p :        # 如果p空了,注:这里还不能用分支写,如p=’a',p[1:]是啥??
        return not s   # 如果s也空了,匹配完成,返回True;如果s没空,匹配没有完成,返回False
    f1_match = bool(s) and p[0] in [s[0],'.']  # s不为空且第一个元素匹配上了,
    if len(p)>1 and p[1]=='*':                     # 有*的情况
        return (isMatch(s,p[2:]) or ( f1_match and isMatch(s[1:],p) ))
    else:                                          # 没有*的情况
        return f1_match and isMatch(s[1:],p[1:])  
       
print(isMatch('aa','a*aa'))
# isMatch('aaaa','a*')        

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值