当前位置: 首页 > article >正文

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

编辑距离

  • https://leetcode.cn/problems/edit-distance/description/

描述

  • 给你两个单词 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: 动态规划

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: 动态规划自底向上

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];
}

http://www.kler.cn/a/460633.html

相关文章:

  • df.replace({‘b‘: r‘\s*(\.)\s*‘}, {‘b‘: r‘\1ty‘}, regex=True)
  • 双目视觉:reprojectImageTo3D函数
  • python实现自动登录12306抢票 -- selenium
  • Docker--Docker Container(容器) 之 操作实例
  • 网络:常用的以太网PHY芯片
  • Linux命令——3.网络与用户
  • 198.213.337.打家劫舍
  • MySql find_in_set 函数
  • 数据仓库: 9- 数据仓库数据治理
  • KubeOS
  • java基于ThreadLocal实现单例模式
  • Android 系统 AlertDialog 系统层深度定制
  • 基于AT89C51单片机的可暂停八路抢答器设计
  • 试用ChatGPT的copilot编写一个程序从笔记本电脑获取语音输入和图像输入并调用开源大模型进行解析
  • 【一起python】银行管理系统
  • linux上使用cmake编译的方法
  • ArrayList 和LinkedList的区别比较
  • 酒后饮品选择指南:科学缓解不适
  • 2024年年度总结
  • Pyqt5学习(学习中)
  • LoRaWAN协议在基于低地球轨道的大规模机器类通信架构中的无缝集成
  • 游戏引擎学习第64天
  • 柱状图中最大的矩形 - 困难
  • 微服务-Sentinel新手入门指南
  • UE5在蓝图中使用VarestX插件访问API
  • html+css网页制作 美食 美食每刻4个页面