题目:
思路:使用动态规划,建立dp表,注意此类问题都要多加一行和一列,并且第一行和第一列都要先单独考虑,如下图所示。
dp[i][j]
表示word1
的前i
位转化到word2
的前j
位所需的最少步骤。
第一行,是word1
为空,变成word2
最少步数,就是插入操作
第一列,是word2
为空,需要的最少步数,就是删除操作
根据所列dp表的规律,可以发现:
当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
代码实现
class Solution:
def minDistance(self, word1: str, word2: str) -> int:
row = len(word1)
col = len(word2)
dp = [[0] * (col+1) for _ in range(row+1)]
# print(dp)
#第一列
for i in range(1,row+1):
dp[i][0] = dp[i-1][0] + 1
#第一列
for j in range(1,col+1):
dp[0][j] = dp[0][j-1] + 1
#注意dp标相应位置的的下标为两个字符下标+1
for i in range(row):
for j in range(col):
if word1[i] == word2[j]:
dp[i+1][j+1] = dp[i][j]
else:
dp[i+1][j+1] = min(dp[i][j],dp[i+1][j],dp[i][j+1]) + 1
# print(dp)
return dp[-1][-1]