×10. 正则表达式匹配

二维DP - 图1二维DP - 图2二维DP - 图3二维DP - 图4

  1. class Solution:
  2. def isMatch(self, s: str, p: str) -> bool:
  3. m, n = len(s) + 1, len(p) + 1
  4. dp = [[False] * n for _ in range(m)]
  5. dp[0][0] = True
  6. # 初始化首行
  7. for j in range(2, n, 2):
  8. dp[0][j] = dp[0][j - 2] and p[j - 1] == '*'
  9. # 状态转移
  10. for i in range(1, m):
  11. for j in range(1, n):
  12. if p[j - 1] == '*':
  13. if dp[i][j - 2]: dp[i][j] = True # 1.
  14. elif dp[i - 1][j] and s[i - 1] == p[j - 2]: dp[i][j] = True # 2.
  15. elif dp[i - 1][j] and p[j - 2] == '.': dp[i][j] = True # 3.
  16. else:
  17. if dp[i - 1][j - 1] and s[i - 1] == p[j - 1]: dp[i][j] = True # 1.
  18. elif dp[i - 1][j - 1] and p[j - 1] == '.': dp[i][j] = True # 2.
  19. return dp[-1][-1]

×72. 编辑距离(困难)

二维DP - 图5
二维DP - 图6二维DP - 图7二维DP - 图8二维DP - 图9
【i-1】【j-1】表示将word[i]替换成word[j],删除表示删除word1[i-1],插入表示在word1[j-1]前面插入
二维DP - 图10

  1. class Solution:
  2. def minDistance(self, word1: str, word2: str) -> int:
  3. n1 = len(word1)
  4. n2 = len(word2)
  5. dp = [[0] * (n2 + 1) for _ in range(n1 + 1)] # 注意,行数为word1+1,列数为word2+1,dp[i][j]表示1到2的步数
  6. # 第一行,空字符到 word2
  7. for j in range(1, n2 + 1):
  8. dp[0][j] = dp[0][j-1] + 1
  9. # 第一列,word1 到空字符串
  10. for i in range(1, n1 + 1):
  11. dp[i][0] = dp[i-1][0] + 1
  12. for i in range(1, n1 + 1): # 注意索引值
  13. for j in range(1, n2 + 1):
  14. if word1[i-1] == word2[j-1]:
  15. dp[i][j] = dp[i-1][j-1]
  16. else:
  17. dp[i][j] = min(dp[i][j-1], dp[i-1][j], dp[i-1][j-1] ) + 1
  18. #print(dp)
  19. return dp[-1][-1]