动态规划:
dp[i][j] 代表 word1 到 i 位置转换成 word2 到 j 位置需要最少步数。
所以,
当 word1[i] == word2[j],dp[i][j] = dp[i-1][j-1]
;
当 word1[i] != word2[j],dp[i][j] = min(dp[i-1][j-1], dp[i-1][j], dp[i][j-1]) + 1
其中,dp[i-1][j-1]
表示替换操作,dp[i-1][j]
表示删除操作,dp[i][j-1]
表示插入操作。
注意,针对第一行,第一列要单独考虑,我们引入 ‘’ 下图所示:
第一行,是 word1 为空变成 word2 最少步数,就是插入操作
第一列,是 word2 为空,需要的最少步数,就是删除操作
class Solution:
def minDistance(self, word1: str, word2: str) -> int:
# dp[i][j] 表示前i个word1转换成前j个Word2所执行的操作数
m = len(word1)
n = len(word2)
dp = [[0]*(n+1) for j in range(m+1)]
for i in range(1,n+1): dp[0][i] = i
for j in range(1, m+1): dp[j][0] = j
for i in range(1,m+1):
for j in range(1,n+1):
if word1[i-1]==word2[j-1]:
dp[i][j] = dp[i-1][j-1]
else:
dp[i][j] = min(dp[i - 1][j-1], dp[i][j - 1],dp[i-1][j]) + 1
# 替换,增,删
return dp[-1][-1]
来源:CSDN
作者:三岁与十八
链接:https://blog.csdn.net/qq_27921205/article/details/104186591