Leetcode 72 编辑距离
困难题
属于动态规划中的字符串编辑问题;
这一类方法一般是定义一个二维数组,i表示处理到第一个序列的第i个元素为止,j表示处理到第二个序列的第j个元素为止的最佳匹配。
题目
给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。
你可以对一个单词进行如下三种操作:
- 插入一个字符
- 删除一个字符
- 替换一个字符
示例1
输入:word1 = "horse", word2 = "ros"
输出:3
解释:
horse -> rorse (将 'h' 替换为 'r')
rorse -> rose (删除 'r')
rose -> ros (删除 'e')
示例2
输入:word1 = "intention", word2 = "execution"
输出:5
解释:
intention -> inention (删除 't')
inention -> enention (将 'i' 替换为 'e')
enention -> exention (将 'n' 替换为 'x')
exention -> exection (将 'n' 替换为 'c')
exection -> execution (插入 'u')
提示
- 0 <= word1.length, word2.length <= 500
- word1 和 word2 由小写英文字母组成
解法
- 定义一个二维数组,i表示处理到第一个序列的第i个元素为止,j表示处理到第二个序列的第j个元素为止,编辑字符串使其相同的最少操作数。
- 状态转移方程
-
如果第i个元素和第j个元素是相同(该字符可匹配),那么只需要考虑前面的字符串匹配的最少次数;也就是 d p [ i ] [ j ] = d p [ i − 1 ] [ j − 1 ] dp[i][j]=dp[i-1][j-1] dp[i][j]=dp[i−1][j−1]
-
如果元素不同,那么就通过修改/插入/删除,使得对应位置元素相同从而向前考虑,那么可以考虑三种情况:
- 修改字符串元素(i or j)使得其对应位置上的元素相同 d p [ i ] [ j ] = d p [ i − 1 ] [ j − 1 ] + 1 dp[i][j]=dp[i-1][j-1]+1 dp[i][j]=dp[i−1][j−1]+1
- 对第一个序列的 i 位置做插入操作(相当于对第二个序列的 j 位置做删除操作)使得对应位置元素相同 d p [ i ] [ j ] = d p [ i ] [ j − 1 ] + 1 dp[i][j]=dp[i][j-1]+1 dp[i][j]=dp[i][j−1]+1
- 对第二个序列的 j 位置做插入操作(相当于对第一个序列的 i 位置做删除操作)使得对应位置元素相同 d p [ i ] [ j ] = d p [ i − 1 ] [ j ] + 1 dp[i][j]=dp[i-1][j]+1 dp[i][j]=dp[i−1][j]+1
找上述三种情况最优解也就是 d p [ i ] [ j ] = m i n ( d p [ i − 1 ] [ j − 1 ] , d p [ i ] [ j − 1 ] , d p [ i − 1 ] [ j ] ) + 1 dp[i][j]= min(dp[i-1][j-1],dp[i][j-1],dp[i-1][j])+1 dp[i][j]=min(dp[i−1][j−1],dp[i][j−1],dp[i−1][j])+1
-
- dp数组的初始化:定义dp的维度为m+1,n+1(m,n是第一,二个序列的长度)相当于添加了两个空字符串,那么对于i=0,或者j=0时,需要删除/插入,j或者i次;
- 遍历顺序,从dp数组的左上角遍历到右下角;
- 返回 d p [ m ] [ n ] dp[m][n] dp[m][n]即可
class Solution:
def minDistance(self, word1: str, word2: str) -> int:
m,n = len(word1),len(word2)
dp = [[0 for _ in range(n+1)] for _ in range(m+1)]
for i in range(m+1):
for j in range(n+1):
if i==0: dp[i][j] = j
elif j==0: dp[i][j] = i
elif 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[m][n]
- 时间复杂度 O(mn)
- 空间复杂度 O(mn)