执行结果
代码部分
class Solution(object):
def minDistance(self, word1, word2):
"""
:type word1: str
:type word2: str
:rtype: int
"""
m = len(word1)
n = len(word2)
dp=[[0]*(n+1) for _ in range(m+1)] #m+1行 n+1列
if m==0:
return n
if n==0:
return m
#初始化
for i in range(m+1):
dp[i][0]=i #第i行第一列
for j in range(n+1):
dp[0][j]=j #第一行第j列
#状态转移
#i,j代表word1,word2对应位置的index
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]=1+min(dp[i-1][j],dp[i-1][j-1],dp[i][j-1])
return dp[m][n]
题解
题解如上:首先初始化一个dparray(m+1行,n+1列)
其中m = len(word1) n = len(word2)
创建dparray的过程就是dp=[[0]*(n+1) for _ in range(m+1)]
观察上图,从某一个值dp[i][j]的值是可以从三个状态进行变化过来的分别是:
dp[i-1][j]、dp[i-1][j-1]、dp[i][j-1]
举个例子:
还有一种特殊情况,就是当单词1和单词2的最后一位是相同的字母的时候,我们可以不用看这个最后一位了,这样,我们的动态规划规模缩减到了dp[i][j]=dp[i-1][j-1]
比如这种情况:
当word1为ho,word2为ro的时候我们可以将问题虽小规模为找寻"h"和"r"之间的最短距离。
具体详细视频可以在leetcode上看一下这位博主的讲解:https://leetcode-cn.com/problems/edit-distance/solution/xiong-mao-shua-ti-python3-dong-tai-gui-hua-yi-dong/