LC 72动态规划中等第 84 / 95 题

编辑距离

Edit Distance

动态规划二维 DP
本机进度仅保存在当前浏览器

题目描述

给你两个单词 word1 和 word2,请返回将 word1 转换成 word2 所使用的最少操作数。可以对一个单词进行三种操作:插入一个字符、删除一个字符、替换一个字符。

示例:word1 = "horse",word2 = "ros",输出 3(horse -> rorse -> rose -> ros)。

解题思路

  1. 状态 dp[i][j]:word1 前 i 个字符变成 word2 前 j 个字符的最少操作数。
  2. 末字符相等时免费继承 dp[i-1][j-1];不等时在「删、插、改」三种操作中取最小再加一。
  3. 边界是空串情形:dp[i][0] = i(全删)、dp[0][j] = j(全插);该状态定义同时给出了边界含义。

参考实现

查看参考实现Python · 建议先自行作答
def minDistance(word1, word2):
    m, n = len(word1), len(word2)
    dp = [[0] * (n + 1) for _ in range(m + 1)]
    for i in range(m + 1):
        dp[i][0] = i
    for j in range(n + 1):
        dp[0][j] = 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] = 1 + min(dp[i - 1][j],      # 删除
                                   dp[i][j - 1],      # 插入
                                   dp[i - 1][j - 1])  # 替换
    return dp[m][n]

复杂度与归属

时间复杂度O(m · n)
空间复杂度O(m · n)
所属分类动态规划
题源LeetCode 72

关联教程

返回题图鉴