题目描述
请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
递归的思想。
# -*- coding:utf-8 -*-
class Solution:
# s, pattern都是字符串
def match(self, s, pattern):
# s和p都为空,两个空串一定匹配;
if s == "" and pattern == "":
return True
# p为空,一定不匹配;
elif s != "" and pattern == "":
return False
# s为空,就要检查p了,如果p是a*b*c*形式的,则p可以转化成空串;
elif s == "" and pattern != "":
# 如果p长度大于2,并且p[1]是个*,才能符合上面可以变成空串的形式;
if len(pattern) >= 2 and pattern[1] == '*':
# 继续递归检查p[2:]后面的是否符合;
return self.match(s, pattern[2:])
else:
return False
if len(pattern) >=2 and pattern[1] == '*':
# 第一个元素匹配成功,有三种继续进行的选择,都要尝试一下;
if s[0] == pattern[0] or pattern[0] == '.':
# 第一种是为了防止 s="bbba", p=".*a"这种情况,这个我们一看就是匹配的;
# 但是它有可能一个".*"就把"bbba"都匹配掉了,p剩下个"a",会认为匹配失败。
# 第二种是匹配成功,并且s、p都移动;
# 第三种是,s移动,p的*留着。
return self.match(s, pattern[2:]) or self.match(s[1:], pattern[2:]) or self.match(s[1:], pattern)
# 如果第一个元素匹配失败,p后移2个,相当于(*=0)
else:
return self.match(s, pattern[2:])
# 没有*的情况,直接匹配第一个元素看是否成功;
elif s[0] == pattern[0] or pattern[0] == '.':
return self.match(s[1:], pattern[1:])
else:
return False