leetcode(6)- 正则表达式匹配
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。
'.' 匹配任意单个字符
'*' 匹配零个或多个前面的那一个元素
链接: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)

浙公网安备 33010602011771号