LeetCode 72. Edit Distance 题解

LeetCode 72. Edit Distance 题解

题目描述

给你两个单词 word1 和 word2,请你计算出将 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 个字符所需的最少操作数。根据当前字符是否匹配,选择不同的操作策略。

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

相关推荐
骑着蜗牛撵大象3272 分钟前
558 万美元训出 671B 模型:DeepSeek-V3 算法与系统的协同拆解
分布式·算法·moe·deepseek-v3·mla·fp8训练
Eyfcom4 分钟前
〖阶段性回顾〗物流系统架构与算法的 Day 1-5 知识图谱与实战答疑
算法·系统架构·知识图谱·物流管理系统·快递管理系统
xunberg9 分钟前
【Agent 生产化手记-02】Agent 怎么向人提问
人工智能·算法·架构
海绵宝宝转agent15 分钟前
Leetcode二叉树算法个人理解
笔记·学习·算法·leetcode·深度优先
Rain的Java大神之路34 分钟前
面试被LeetCode 27(移除元素)问懵?别再用两层 for 循环了:一道“简单题”吃透双指针原地删除,附面试加分话术 + 11 个避坑清单
后端·leetcode·面试
pjj1985439 分钟前
YOLO 目标检测算法系列梳理:从 V1 到 V5 的原理演进
算法·yolo·目标检测
二十七日秋1 小时前
算法刷题笔记「Day 1|四道 OJ 入门题里的深坑」
c语言·汇编·数据结构·c++·笔记·python·算法
晚风叙码1 小时前
Linux 进程概念(下):程序地址空间与虚拟内存
linux·服务器·算法
silvamux_2 小时前
微头条爆款体平台适配实测:把交付要求变成可计算的指标
java·线性代数·算法·决策树·矩阵
重生之小比特2 小时前
【算法拾光】前缀和|连续的子数组和 + 和相同的二元子数组
算法·leetcode·哈希算法