11
first_match = bool (s and p[0] in {s[0],'.'})
# 如 果 模 式 的 第 二 个 字 符 为 '*'
if len(p) > 1 and p[1] == '*':
# 如 果 模 式 中 的 第 一 个 字 符 和 字 符 串 中 的 第 一 个 字 符 相 匹 配 , 则 字 符 串 向 后 移 动 一
个 字 符 , 模 式 有 两 种 选 择 , 一 种 是 向 后 移 动
两 个 , 一 种 是 保 持 不 变
# 如 果 模 式 中 的 第 一 个 字 符 与 字 符 串 中 的 第 一 个 字 符 不 匹 配 , 则 字 符 串 不 动 , 模 式
向 后 移 动 两 个 字 符
# isMatch (s ,p[2 :]): 代 表 相 当 于 * 匹 配 0 个 字 符
if first_match:
return self.isMatch(s[1:],p) or self.isMatch (s[1:],p[2:])
else:
return self.isMatch(s,p[2:])
else:
return first_match and self. isMatch (s[1:],p[1:])
解题思路 2:DP,
# 状 态 : DP [i][j] 表 示 字 符 串 s 的 前 i 项 是 否 和 模 式 p 的 前 j 项 匹 配
# 状 态 转 移 方 程
DP[i][j] = DP[i-1][j-1] = True : s[i] = p[j] or p[j] = '.'
p[j] = '*' , 由 于 星 号 与 前 面 的 字 符 相 关 联 , 因 此 我 们 比 较 星 号 前 面 的 字 符 p[j-1] 和 s[
i] 的 关 系
DP[i][j] = DP[i][j-2] : p[j] = '*' and p[j-1] != s[i]
DP[i][j] = DD[i-1][j] : p[j] = '*' and (p[j-1] = s[i] or p[j-1] = '.')
False : DP[i][j] = False
# 初 始 状 态 :
DP[0][0] = True
DP[0][1] = False
class Solution ( object):
def isMatch(self , s, p):
if s == p:
return True
len_s = len (s)
len_p = len (p)
dp = [[False] * (len_s + 1) for _ in range ( len_p + 1)]
dp[0][0] = True
for i in range(1, len_p + 1):
if p[i - 1] not in ['.', '*']:
for j in range(1, len_s + 1):
dp[i][j] = dp[i - 1][j - 1] and s[j - 1] == p[i - 1]
elif p[i - 1] == '.':
for j in range(1, len_s + 1):
dp[i][j] = dp[i - 1][j - 1]