m = len(s)
n = len(p)
# dp[i][j]表示s长度为i,p长度为j时,s与p是否匹配,因为是从长度为0开始的,所以这里dp的长度为【m+1】【n+1】
dp = [[False for _ in range(n+1)] for __ in range(m+1)]
# 初始化
dp[0][0] = True
# 注意两个地方,
# 1、dp中的索引是指长度,所以在对应到字符串中的时候都要减一,
# 2、for循环遍历的是dp中的索引,所以右边界要加1
for _ in range(2,n+1):
if p[_-1] == '*':
dp[0][_] =dp[0][_-2]
for i in range(1,m+1):
for j in range(1,n+1):
if p[j-1] != "*":
if s[i-1] == p[j-1] or p[j-1] == ".":
dp[i][j] = dp[i-1][j-1]
else:
# 如果和*前一个值不相等(而且不是".")最好的情况就是让*=0——不对前面的时进行重复,那就是和*往前两个的值进行比较
if p[j-2] != s[i-1] and p[j-2] != ".":
dp[i][j] = dp[i][j-2]
else:
#匹配0个or匹配1个or匹配多个
dp[i][j] = dp[i][j-2] or dp[i][j-1] or dp[i-1][j]
return dp[-1][-1]
共以下 7 个回答
真的难
时间空间复杂度为O(nm)
时间:O(mn),空间:O(mn)