学习动态规划的应用
文章目录
解题思路
针对p[j-1] == '*'
时,f[i][j] |= f[i][j-2]
是因为只要当前j-1
指向*
时,
- 如果不匹配 s s s中的字符,则丢弃 ∗ * ∗号组合
- 若匹配,则也可以丢弃
∗
*
∗号组合
class Solution:
def isMatch(self, s: str, p: str) -> bool:
m, n = len(s), len(p)
def match(i: int, j: int) -> bool:
# 前0个字符为空字符,直接返回False
if i == 0:
return False
if p[j-1] == '.':
return True
return s[i-1] == p[j-1]
# 状态矩阵, f[i][j]表示s的前i个字符和p的前j个字符是否匹配
f = [[False] * (n+1) for i in range(m+1)]
# 两个空字符串直接匹配
f[0][0] = True
for i in range(m+1):
for j in range(1, n+1):
if p[j-1] == '*':
f[i][j] |= f[i][j-2]
if match(i, j-1):
f[i][j] |= f[i-1][j]
else:
if match(i, j):
f[i][j] |= f[i-1][j-1]
return f[m][n]
复杂度分析
- 时间复杂度: O ( m n ) O(mn) O(mn),其中 m m m 和 n n n 分别是字符串 s s s 和 p p p的长度。我们需要计算出所有的状态,并且每个状态在进行转移时的时间复杂度为 O ( 1 ) O(1) O(1)。
- 空间复杂度: O ( m n ) O(mn) O(mn),即为存储所有状态使用的空间。