给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。
'.' 匹配任意单个字符
'*' 匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。
from collections import defaultdict
class Solution:
def __init__(self):
self.dp = defaultdict(lambda: -1)
def isMatch(self, s: str, p: str) -> bool:
return self.helper(0, 0, s, p) == 1
def helper(self, i, j, s, p):
if self.dp[i, j] != -1:
return self.dp[i, j]
if j == len(p):
self.dp[i, j] = i == len(s)
return self.dp[i, j]
if j + 1 < len(p) and p[j + 1] == '*':
res = self.helper(i, j + 2, s, p)
for k in range(i, len(s)):
if p[j] in {s[k], '.'}:
res = res or self.helper(k + 1, j + 2, s, p)
else:
break
self.dp[i, j] = res
return self.dp[i, j]
if i < len(s) and p[j] in {s[i], '.'}:
self.dp[i, j] = self.helper(i + 1, j + 1, s, p)
return self.dp[i, j]
self.dp[i, j] = False
return self.dp[i, j]