サポート「」と「*」正規表現のマッチングでを実装するためにあなたを招待し、あなたの文字列sと法pを与えます。
「」任意の一文字にマッチ
『*』マッチがゼロまたはそれ以上の前述の1つの要素を
リンク:https://leetcode-cn.com/problems/regular-expression-matching
アイデアは、そこにある、書き込みにあまり複雑公式コードよりもではありません
class Solution:
def isMatch_i(self,s,p,s_begin,p_begin):
if s_begin >= len(s) and p_begin >= len(p):
return True
elif s_begin < len(s) and p_begin >= len(p):
return False
elif s_begin >=len(s):
if p_begin+1<len(p) and p[p_begin+1]=='*':
return self.isMatch_i(s,p,s_begin,p_begin+2)
else :
return False
if self.flag[s_begin][p_begin] != 0:
return True if self.flag[s_begin][p_begin]==1 else False
isM = 0
if p_begin+1 < len(p) and p[p_begin+1]=='*':
isM = isM+1 if self.isMatch_i(s,p,s_begin, p_begin+2) else isM
if p[p_begin]==s[s_begin] or p[p_begin]=='.':
isM = isM+1 if self.isMatch_i(s,p,s_begin+1, p_begin) else isM
else: # 不存在*的情况
isM = isM+1 if self.isMatch_i(s,p,s_begin+1, p_begin+1) and (s[s_begin]==p[p_begin] or p[p_begin]=='.') else isM
self.flag[s_begin][p_begin] = 1 if isM>0 else -1
return True if isM>0 else False
def isMatch(self, s: str, p: str) -> bool:
self.flag = [[0 for i in range(len(p)+2)] for i in range(len(s)+2)]
return self.isMatch_i(s, p, 0, 0)
class Solution(object):
def isMatch(self, text, pattern):
memo = {}
def dp(i, j):
if (i, j) not in memo:
if j == len(pattern):
ans = i == len(text)
else:
first_match = i < len(text) and pattern[j] in {text[i], '.'}
if j+1 < len(pattern) and pattern[j+1] == '*':
ans = dp(i, j+2) or first_match and dp(i+1, j)
else:
ans = first_match and dp(i+1, j+1)
memo[i, j] = ans
return memo[i, j]
return dp(0, 0)