错误的分析


编辑距离 - 图1
编辑距离 - 图2

递归解法

  1. class Solution:
  2. def minDistance(self, word1: str, word2: str) -> int:
  3. def dp(i, j):
  4. """
  5. dp(i, j): word_i, word_j的最短编辑距离
  6. 假设:
  7. word:x_1...x_n y_1...y_m
  8. 编辑结果:z_1...z_k
  9. 显然z_必然然属于set(x) | set(y), 即z中的元素要么属于x, 要么属于y(或者两者共有)
  10. 若x_n == y_m, 显然。
  11. 若x_n != ym, 假设z_k == x_n, 那么y中 经过增 删 替换后必要有 y_ == z_k:
  12. 替换: 1 + dp(i-1, j-1) 将y_m替换成x_n
  13. 增加: 1 + dp(i-1, j) 增加y_(尾部), 使得y_= x_n
  14. 删除: 1 + dp(i, j-1) 删除y_m
  15. 反之亦然。
  16. """
  17. # base case
  18. if i < 0:
  19. return j + 1
  20. if j < 0:
  21. return i + 1
  22. # make progress
  23. if word1[i] == word2[j]:
  24. return dp(i - 1, j - 1)
  25. else:
  26. return 1 + min(
  27. dp(i, j - 1),
  28. dp(i - 1, j),
  29. dp(i - 1, j - 1)
  30. )
  31. return dp(len(word1) - 1, len(word2) - 1)

正确的分析