数据结构与算法之动态规划: LeetCode 72. 编辑距离 (Ts版)

编辑距离

描述

  • 给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数
  • 你可以对一个单词进行如下三种操作:
    • 插入一个字符
    • 删除一个字符
    • 替换一个字符

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

提示

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

Typescript 版算法实现

1 ) 方案1: 动态规划

ts 复制代码
function minDistance(word1: string, word2: string): number {
    const n = word1.length;
    const m = word2.length;

    // 有一个字符串为空串
    if (n * m === 0) {
        return n + m;
    }

    // DP 数组
    const D: number[][] = Array.from({ length: n + 1 }, () => Array(m + 1).fill(0));

    // 边界状态初始化
    for (let i = 0; i < n + 1; i++) {
        D[i][0] = i;
    }
    for (let j = 0; j < m + 1; j++) {
        D[0][j] = j;
    }

    // 计算所有 DP 值
    for (let i = 1; i < n + 1; i++) {
        for (let j = 1; j < m + 1; j++) {
            const left = D[i - 1][j] + 1;
            const down = D[i][j - 1] + 1;
            let left_down = D[i - 1][j - 1];
            if (word1.charAt(i - 1) !== word2.charAt(j - 1)) {
                left_down += 1;
            }
            D[i][j] = Math.min(left, down, left_down);
        }
    }

    return D[n][m];
}

2 ) 方案2: 动态规划自底向上

ts 复制代码
function minDistance(word1: string, word2: string): number {
    const n1 = word1.length;
    const n2 = word2.length;

    // 初始化 DP 数组
    const dp: number[][] = Array.from({ length: n1 + 1 }, () => Array(n2 + 1).fill(0));

    // 初始化第一行
    for (let j = 1; j <= n2; j++) {
        dp[0][j] = dp[0][j - 1] + 1;
    }

    // 初始化第一列
    for (let i = 1; i <= n1; i++) {
        dp[i][0] = dp[i - 1][0] + 1;
    }

    // 计算所有 DP 值
    for (let i = 1; i <= n1; i++) {
        for (let j = 1; j <= n2; j++) {
            if (word1.charAt(i - 1) === word2.charAt(j - 1)) {
                dp[i][j] = dp[i - 1][j - 1];
            } else {
                dp[i][j] = Math.min(dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]) + 1;
            }
        }
    }

    return dp[n1][n2];
}
相关推荐
绍兴贝贝8 分钟前
代码随想录算法训练营第五十天|图论基础|深度优先搜索理论基础|KM98.所有可达路径|广度优先搜索理论基础
数据结构·人工智能·python·算法·力扣
带多刺的玫瑰2 小时前
Leecode刷题C语言之切蛋糕的最小总开销②
java·数据结构·算法
robin_suli3 小时前
动态规划回文串问题系列一>回文子串
算法·动态规划
观测云4 小时前
日志聚类算法 Drain 的实践与改良
算法·聚类·日志
心软且酷丶4 小时前
leetcode:面试题 17.01. 不用加号的加法(python3解法)
python·算法·leetcode
hjyowl4 小时前
矩阵Matrix(POJ2155)
算法
Dream it possible!4 小时前
LeetCode 热题 100_将有序数组转换为二叉搜索树(42_108_简单_C++)(二叉树;递归)
c++·算法·leetcode·深度优先
MYT_flyflyfly5 小时前
计算机视觉之三维重建-摄像机标定
人工智能·算法·计算机视觉
XiaoLeisj5 小时前
【优选算法 & 分治】深入理解分治算法:分治算法入门小专题详解
算法·leetcode·决策树·深度优先·哈希算法·剪枝·推荐算法
蒲公英的孩子5 小时前
DCU异构程序——带宽测试
c++·分布式·算法·架构