【Golang】LeetCode 72. 编辑距离

72. 编辑距离

题目描述

思路

针对两个字符串,它们的编辑距离是对二者进行修改,最终使两个字符串相等的操作次数。我们将这两个字符串分别命名为A和B,按照题意,我们总共可以采取六种操作,分别是:

  1. 删除A中的一个字符;
  2. 在A插入一个字符;
  3. 在A替换一个字符;
  4. 删除B中的一个字符;
  5. 在B插入一个字符;
  6. 在B替换一个字符;

实际上,上述操作集合是可以被简化的。我们每一次对这两个字符串进行修改的操作集合其实可以缩小为三种,分别是:

  1. 在A插入一个字符;
  2. 在B插入一个字符;
  3. 修改A当中的一个字符。

为什么可以缩小操作的集合?原因是在A插入一个字符其实蕴含了在B当中删除一个字符以使A和B相等的操作;在B插入一个字符亦然;而修改A当中的一个字符其实蕴含了修改B当中的一个字符以使A和B相等,二者的目的是一致的,因此操作等价。

基于上述分析,我们使用二维动态规划来解决这道题。我们声明dp,其维度是(m + 1, n + 1),m是A的长度,n是B的长度。dp[i][j]的含义就是令0...i和0...j两个子串相等的编辑距离最小代价。显然,在初始时有dp[i][0] == i以及dp[0][j] == j,也就是从空字符串变为B[0:j]子串需要在A插入j个字符。

我们使用双重循环来对dp数组进行维护,每次dp[i][j]的数据来源有三处,分别是dp[i - 1][j] + 1、dp[i][j - 1] + 1以及change_cost。dp[i - 1][j] + 1指的就是在0...i - 1子串追加一个字符来使得两个字符串相等;dp[i][j - 1] + 1与之类似;change_cost指的就是通过"更换A当中的一个字符来让子串相等的情况",此时需要分情况判断:如果A[i - 1] == B[j - 1](注意,dp从1开始遍历,而A和B的下标从0开始,因此这里需要-1以对应上下标),那么不需要替换字符,change_cost == dp[i - 1][j - 1];否则需要替换一个字符,change_cost == dp[i - 1][j - 1] + 1。

状态转移方程是dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1, change_cost)。

基于以上思路,我们来写代码解决这个问题。

Golang 题解

go 复制代码
func minDistance(word1 string, word2 string) int {
    m, n := len(word1), len(word2)
    dp := make([][]int, m + 1)
    for i := 0; i <= m; i ++ {
        dp[i] = make([]int, n + 1)
        dp[i][0] = i
        if i == 0 {
            for j := 0; j <= n; j ++ {
                dp[i][j] = j
            }
        }
    }

    for i := 1; i <= m; i ++ {
        for j := 1; j <= n; j ++ {
            change_cost := dp[i - 1][j - 1]
            if word1[i - 1] != word2[j - 1] {
                change_cost += 1
            }
            dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1, change_cost)
        }
    }

    return dp[m][n]
}
相关推荐
moshuying1 小时前
块扩散 + GDN 改造:Clover 把「并行生成」塞进了 Agent 的长上下文里
前端·算法
没落之王1 小时前
历史系统建模:宋初太祖太宗「再立天庭」秩序重构推演
人工智能·算法·重构
INGNIGHT2 小时前
91 · 最小调整代价(序列dp)
数据结构·算法·leetcode
moshuying2 小时前
扩散模型开始写代码、开网页了:350 亿参数,速度比 Jev 快一倍
前端·算法
小超人诞生日记2 小时前
C++ 异常机制详解:从抛出捕获到异常安全
c++·算法
labuladong3 小时前
机器学习&神经网络 系列教程上线
神经网络·算法·机器学习
xiangyun613 小时前
C++ 手撕 shared_ptr:引用计数与控制块到底长什么样?
开发语言·c++·算法·面试·stl
学习论之费曼学习法4 小时前
无人值守AI内容矩阵实战(8):标题 A/B 实验的 6 个工程实现细节,隔日对比与自动判胜
人工智能·python·算法·矩阵·自动化·a/b测试·内容矩阵
Carl_奕然4 小时前
【机器视觉】最强算法之:3D高斯泼溅(3D Gaussian Splatting)
人工智能·python·算法·目标检测·计算机视觉·3d
w_zero_one4 小时前
算法--桶思想
java·开发语言·算法