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 个字符所需的最少操作数。根据当前字符是否匹配,选择不同的操作策略。

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

相关推荐
借雨醉东风2 小时前
程序分享--常见算法/编程面试题:旋转矩阵
c++·线性代数·算法·面试·职场和发展·矩阵
_深海凉_2 小时前
LeetCode热题100-打家劫舍
算法·leetcode·职场和发展
jghhh013 小时前
使用 MATLAB 实现支持向量回归 (SVR) 预测未来数据
算法·matlab
云泽8083 小时前
笔试算法 - 双指针篇(二):四大经典求和题型 + 有效三角形计数问题
c++·算法
刀法如飞4 小时前
【合并已排序数组的三种实现策略,哪一种更可取?】
算法·程序员
王老师青少年编程4 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【区间贪心】:种树
c++·算法·贪心·csp·信奥赛·区间贪心·种树
hi_ro_a4 小时前
C++ 哈希表封装 unordered_map /unordered_set
数据结构·c++·算法·哈希算法
Jasmine_llq8 小时前
《B4447 [GESP202512 二级] 环保能量球》
数据结构·算法·数学公式计算(核心)·整数除法算法·多组数据循环处理·输入输出算法·简单模拟算法
蔡大锅9 小时前
🔥 在线学习算力平台推荐-Hyper.AI
人工智能·算法