题目
解析:
这道题目是著名的Levenshtein distance问题,解法当然是动态规划。本题的关键主要是找出三种操作1.insert 2.delete 3. replace这三种操作与动态规划sub problem之间的关系。首先定义一个二维dp数组,dp[i][j]代表将word1[0:i]编辑成word2[0:j]所需要的最短距离。接下来具体分析三种操作与sub problem之间的对应。
- insert操作,insert意味着在word1[0:i]后面加一个字符,这意味着,他不影响word1[0:i],但是这部操作解决了word2第j个字符的distance,所以说现在的sub problem依旧是word1[0:i]到word2[0:j-1]换言之dp[i][j-1]
- replace操作,同样的分析replace操作对应的subproblem应该是dp[i-1][j-1]
- delete操作对应的是dp[i-1][j]
- 而对于某种状态应该分为两种情况,如果当前的word中的当前字符相同,意味着这个位置不需要任何操作。如果不同,那应该采取上面上述操作中最小的一种
综上所述,最后的状态转移方程应该如下:
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],min(dp[i-1][j],dp[i][j-1])) + 1 // 去三种操作中对应sub problem最小的一个
更详细的解析推荐看这个youtube视频,确实讲的非常好
https://www.youtube.com/watch?v=MiqoA-yF-0M
python代码如下: