理解添加和删除

添加

word1 = “a”, word2 = “ad”, 保证 w1中a之前字符串与 w2 a之前的字符串一样 ,

然后在w1 a之后插入’d’, dp[i][j] = dp[i][j - 1] + 1

删除

word1 = “ad”, word2 = “a”, 保证 w1中a之前字符串与 w2 a之前的字符串一样 ,

然后在w1 a之后删除’d’, dp[i][j] = dp[i - 1][j] + 1

替换

word2添加一个元素,相当于word1删除一个元素,例如 word1 = “ad” ,word2 = “a”,word1删除元素’d’ 和 word2添加一个元素’d’,变成word1=“a”, word2=“ad”, 最终的操作数是一样! dp数组如下图所示意的:

a a d

±----±----+ ±----±----±----+

| 0 | 1 | | 0 | 1 | 2 |

±----±----+ ===> ±----±----±----+

a | 1 | 0 | a | 1 | 0 | 1 |

±----±----+ ±----±----±----+

d | 2 | 1 |

±----±----+

自己的理解:

word1[0 , i] word2[0 … j]

问题的分类

● 如果word1[i] == word[j] ,此时只需要 编辑 word1[0 … i -1] 和word2[0 , j - 1] 的操作

● 如果 word1[i] /= word[j] 分为3种情况:

  1. 插入字符 在word1末尾插入一个word2[j], 此时只需要比较 word1[0 …i] 和word2[0 , j -1]
  2. 删除字符, 在word1 删除最后一个字符。 此时只需要比较 word1[0 , i - 1] 和 word2[0 , j]
  3. 替换字符 把word1最后一个字符 word1[i]替换为word2[j], 此时只需要比较 word1[0, i -1] 和 word[0, j -1]

然后把操作数去最小值 然后 + 1

● 模式识别, 一旦设计值问题, 可以用自顶向下的递归 和自底向上的动态规划

class Solution:
def minDistance(self, word1: str, word2: str) -> int:

m, n = len(word1), len(word2)

# # dp[i][j] :word1前i个字符 ==》 word2 前j 个字符最小部步数
# 至于为什么是m +1 , n +1 , 原因是空字符串
dp =[[0 for _ in range(n + 1)] for _ in range(m + 1)]

# " " r o s
# " " 0 1 2 3
# h 1
# o 2
# r 3
# s 4
# e 5


# 初始值为
for i in range(n + 1):
dp[0][i] = i


for j in range(m + 1):
dp[j][0] = j

for i in range(1, m + 1):
for j in range(1, n + 1):
// 对应到字符串下标应该减1
if word1[i - 1] == word2[j -1]:
dp[i][j] = dp[i - 1][j-1]
else:
insert = dp[i][j - 1]
delete = dp[i - 1][j]
udp = dp[i - 1][j - 1]

dp[i][j] = min(insert, delete, udp) + 1

return dp[m][n]