【题目描述】
请实现一个函数用来匹配包括’.‘和’*‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
【解题思路】
整体的解释见代码以及代码注释:
# -*- coding:utf-8 -*-
class Solution:
# s, pattern都是字符串
def match(self, s, p):
# 都匹配完了
if len(s)==0 and len(p)==0:
return True
# pattern匹配完了,但是s还没有结束
if len(p)==0 and len(s)>0:
return False
# 接下来匹配带"*"的情况
if len(p)>1 and p[1]=='*':
# 如果s和pattern当前位相等 或者 pattern的当前位是“.”(可以与任意字符匹配)
# 因为“*”表示它前面的字符可以出现任意次(包含0次),所以有三种可能的下一步状态:
# 1.它前面的字符出现0次
# 2.它前面的字符匹配1到多次(一次次地进行匹配)
# 3.匹配完毕,进入到下一个状态
if len(s)>0 and (s[0]==p[0] or p[0]=='.'):
return self.match(s, p[2:]) or self.match(s[1:], p) or self.match(s[1:], p[2:])
# 如果s和pattern当前位不相等,证明"*"前面的字符匹配0次
else:
return self.match(s, p[2:])
# 如果s和pattern当前位相等 或者 pattern的当前位是“.”(可以与任意字符匹配),则进入下一个状态
if len(s)>0 and (s[0]==p[0] or p[0]=='.'):
return self.match(s[1:], p[1:])