动态规划。
class Solution(object):
def isMatch(self, text, pattern):
def match(self, text, pattern):
res = {}
def fun(i,j):
if (i,j)not in res:# 如果不存在,就添加
if j == len(pattern):
ans = i == len(text)# 如果匹配式到了最后,如果也text也匹配到了最后就返回True
else:
first_match = i < len(text) and pattern[j] in {text[i], '.'}# 如果text还有字符需要匹配,pattern要匹配的字符在.与text字符对应
if j + 1 < len(pattern) and pattern[j+1] == "*":# 如果有下一个字符,且下一个字符为*
ans = fun(i, j + 2) or first_match and fun(i + 1, j)# 匹配就跳过pattern字符,或者将text向后移动一个字符
else:
ans = first_match and fun(i+1,j+1)# 否则在当前字母匹配的情况下向后一位移动
res[(i,j)] = ans
return res[i,j]
return fun(0,0)
需要注意的是,python中的and运算符,如果左边的运算决定了结果,右边就不再运算了。
class Solution(object):
def isMatch(self, s, p):
sn = len(s)
pn = len(p)
res = [[False]*(pn+1) for i in range(sn+1)]
res[0][0] = True
if p[0]=="*":
res[0][1] = True
for i in range(2,pn+1):
if p[i-1] == "*":
res[0][i] = res[0][i-2]
for i in range(1,sn+1):
for j in range(1,pn+1):
if p[j-1] == "*":
# 没有匹配 匹配一个 匹配多个
res[i][j]= res[i][j-2] or res[i][j-1] or res[i-1][j]
elif p[j-1] in[s[i-1],"."]:
res[i][j] = res[i-1][j-1]
print(res)
return res[-1][-1]