class Solution(object):
def isMatch(self, s, p):
"""
:type s: str
:type p: str
:rtype: bool
"""
if len(p)==0:
return len(s)==0
if len(p)>1 and p[1]=='*':
return self.isMatch(s,p[2:]) or (len(s)!=0 and (s[0]==p[0] or p[0]=='.') and self.isMatch(s[1:],p))
else:
return len(s)!=0 and (s[0]==p[0] or p[0]=='.') and self.isMatch(s[1:],p[1:])
这道题有多种解法,上一题用的是递归解法。思路如下:
先判断p是否为空,为空的话那么s必须也是空,否则没有可匹配的内容了。然后考虑p[2]=='*',因为.可以代表任意一个字符,而*可以代表0个或多个pre元素,更加复杂。我们先考虑第二个字符为*,这意味着它可以重复前面元素任意次。这里就有两种情况,0次和大于0次:
首先考虑0次的时候,此时直接把p中前两个字符去掉再递归,因为前两个字符匹配了空
然后考虑非0次的时候,*匹配了至少一次,那么首先s不能为空,其次满足s[0]和p[0]是匹配的,注意这里的条件是p[1]==*,如果第一个字符不匹配了后面*还匹配了一次就不成立了,最后因为*可以重复多次,比如*可能匹配的是aaa,这时需要逐字符去判断,也就是s右移一位去判断。
如果不满足p.size() > 1 && p[1] == '*',那么就比较第一个字符就可以了,然后再逐字符去调用递归。