题目描述:
正则表达式
给你一个字符串 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*')