LeetCode 72. Edit Distance 题解

LeetCode 72. Edit Distance 题解

题目描述

给你两个单词 word1word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。

你可以对一个单词进行如下三种操作:

  1. 插入一个字符
  2. 删除一个字符
  3. 替换一个字符

示例 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')

解题思路

方法:动态规划

思路

  • 定义 dp[i][j] 为将 word1 的前 i 个字符转换为 word2 的前 j 个字符所需的最少操作数
  • 状态转移方程:
    • 如果 word1[i-1] == word2[j-1],则 dp[i][j] = dp[i-1][j-1]
    • 否则,dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1,分别对应删除、插入和替换操作
  • 初始化:
    • dp[i][0] = i,将 word1 的前 i 个字符删除为空字符串所需的操作数
    • dp[0][j] = j,将空字符串插入 j 个字符得到 word2 的前 j 个字符所需的操作数

复杂度分析

  • 时间复杂度:O(m × n),其中 m 和 n 是两个单词的长度。需要填充一个 m+1 × n+1 的表格。
  • 空间复杂度:O(m × n),需要一个 m+1 × n+1 的表格来存储状态。

代码实现

方法:动态规划

python 复制代码
class Solution:
    def minDistance(self, word1: str, word2: str) -> int:
        m = len(word1)
        n = len(word2)
        
        # 初始化 dp 表格
        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
        
        # 填充 dp 表格
        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] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1
        
        return dp[m][n]

测试用例

测试用例 1:

输入:word1 = "horse", word2 = "ros"

输出:3

测试用例 2:

输入:word1 = "intention", word2 = "execution"

输出:5

测试用例 3:

输入:word1 = "", word2 = "a"

输出:1

测试用例 4:

输入:word1 = "a", word2 = ""

输出:1

总结

本题是动态规划的经典问题,主要考察对状态定义和状态转移方程的理解。通过动态规划,我们可以高效地计算出将一个单词转换为另一个单词所需的最少操作数。

动态规划的核心思想是:通过填充一个二维表格,记录将 word1 的前 i 个字符转换为 word2 的前 j 个字符所需的最少操作数。根据当前字符是否匹配,选择不同的操作策略。

这种方法不仅适用于编辑距离问题,还可以应用于许多其他需要比较两个序列的问题,例如最长公共子序列、最长回文子串等。掌握动态规划的思想,对于解决这类问题非常重要。

相关推荐
threerocks17 分钟前
Jev 入门第一课
算法
西柚研究生1234561 小时前
论文分析17:YOLOv11_UAVNet:无人机航拍图像专用目标检测算法
人工智能·python·深度学习·算法·目标检测
hetao17338372 小时前
2026-09-17 hetao1733837 的刷题记录
c++·算法
午彦琳3 小时前
2026.9.17
数据结构·算法·leetcode
木井巳3 小时前
【记忆化搜索】不同路径
java·算法·leetcode·深度优先·剪枝·推荐算法
怕浪猫4 小时前
从 Windows 换到 Mac 三个月,我真香了
算法·面试·架构
aichitang20245 小时前
前端小skill
前端·人工智能·算法·ai·前端框架
All for pursuit.6 小时前
【链表-9】146.LRU缓存
数据结构·c++·算法·leetcode
木子算法6 小时前
测出来的值会抖:约束和目标带噪声时,「可行」和「更好」该怎么判
人工智能·算法·目标跟踪
圣保罗的大教堂6 小时前
leetcode 1477. 找两个和为目标值且不重叠的子数组 中等
leetcode