在问 · 算法题解

72. 编辑距离

题目描述

输入两个字符串 word1 和 word2。

每次操作可以对 word1 做下面三件事之一:在任意位置插入一个字符、删掉一个字符、把一个字符换成另一个字符。

返回把 word1 变成 word2 至少需要几次操作。

示例 1
输入:word1 = "horse", word2 = "ros"
输出:3

解释:把 h 换成 r 得 rorse,删去 r 得 rose,再删去 e 得 ros,共 3 步。

示例 2
输入:word1 = "intention", word2 = "execution"
输出:5

解释:可以通过 2 次删除或插入和 3 次替换完成,例如删 t、把 i 换成 e、把 n 换成 x、把 n 换成 c、插入 u。

数据范围

  • 0 <= word1.length, word2.length <= 500
  • word1 和 word2 由小写英文字母组成。

解题思路

dp[i][j] 表示两个前缀的编辑距离;字符相等沿左上,否则取插入、删除、替换的最小值加一。

为什么正确

每个 dp[i][j] 都是对应两个前缀的最优编辑距离。

复杂度分析

时间 O(mn),空间 O(mn)。

易错点

插入对应左方、删除对应上方、替换对应左上;三种来源不要混淆。

参考代码

Python、Java、C++、Go、JavaScript、TypeScript 六种语言,逻辑一致。

class Solution:
    def minDistance(self, word1: str, word2: str) -> int:
        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]

载入编辑器,自己跑一遍 →

动态规划 专题的其他题目

查看 动态规划 全部题目 →