给定一个输入字符串s和一个模板p,实现支持'.'的正则表达式匹配和'*',p必须涵盖所有s中的字符串。
.;可以表示任何单一字符串
*:可以表示0个或者多个前一个字符
假设s由a-z字母组成,p由a-z和.*组成
Input | Output |
---|---|
s='ab' p='.*' | True(.=a,;*=.=任意字符=b) |
s='aab' p='c*a*b' | True(p=c0aab) |
s='mississippi' p='mis*is*p*.' | False(p=mississpp) |
*不可以做开头,因为*代表字符只能从前一个获得。
迭代
1. 当p为空时,如果s为空则返回True,s不为空则返回False
{if not p: return not s}
2. 判断当前字符是否匹配,当s不为空且p的第一个字符与s的第一个字符或者‘.’相同时,则匹配。
{ match=bool(s) and p[0] in (s[0], '.') }
3. 当p的长度大于2且第2位是''*''时, 跳过*从第三位开始匹配,当第二位不是*时则s与p都从下一位开始判断是否匹配
{if len(p)>=2 and p[1]=='*': return self.isMatch(s, p[2:]) or match and self.idMatch(s[1:], p)
else: return self.isMatch(s[1:], p[1:]) }
class Solution:
def isMatch(self, s: str, p: str) -> bool:
if not p:
return not s
match=bool(s) and p[0] in (s[0],'.')
if len(p)>=2 and p[1]=='*':
return self.isMatch(s,p[2:]) or \
match and self.isMatch(s[1:],p)
else:
return match and self.isMatch(s[1:],p[1:])
时间复杂度:O((s+p)2^(s+2/p))
待续...