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

数据结构与算法之动态规划: 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.lryc.cn/news/513073.html

相关文章:

  • 洪水灾害多智能体分布式模拟示例代码
  • 【前端】Node.js使用教程
  • django33全栈班2025年004 录入数据
  • 小白投资理财 - 看懂 EPS 每股收益
  • Pandas-apply自定义函数
  • github 项目分享
  • 与你共度的烟火日常
  • 基于Python的社交音乐分享平台
  • Kafka的acks机制和ISR列表
  • FreeRTOS: ISR(中断服务例程)和 TCB(任务控制块)
  • 【Spring】Spring DI(依赖注入)详解—自动装配—byType实现原理
  • 015-spring-动态原理、AOP的xml和注解方式
  • linux更换yum源
  • 跨年战揭开本地生活新赛季:美团、抖音和快手争夺冰雪经济
  • 文件传输工具FTransferor<优化篇>
  • 【最新】17个一站式数据集成平台案例PPT下载(Apache SeaTunnel )
  • 【每日学点鸿蒙知识】子窗口方向、RichEdit不居中、本地资源缓存给web、Json转对象丢失方法、监听状态变量数组中内容改变
  • 【AI绘画】Midjourney前置指令/imagine与单图指令详解
  • 【鸿蒙NEXT】鸿蒙里面类似iOS的Keychain——关键资产(@ohos.security.asset)实现设备唯一标识
  • 学习笔记 --C#基础其他知识点(数据结构)
  • AI与药学 | ChatGPT 在临床药学中的有效性以及人工智能在药物治疗管理中的作用
  • Streamlining QA with Automated Testing for 3D Models
  • 产品原型设计
  • 【Linux命令】su、sudo、sudo su、sudo -i、sudo -l的用法和区别
  • 【广州计算机学会、广州互联网协会联合主办 | ACM独立出版 | 高录用】第四届大数据、信息与计算机网络国际学术会议(BDICN 2025)
  • HTML5 开关(Toggle Switch)详细讲解
  • win32汇编环境下,双击窗口程序内生成的listview列表控件的某行,并提取其内容的示例程序
  • mysql主从断开后问题排查及修复
  • [2025] 如何在 Windows 计算机上轻松越狱 IOS 设备
  • 计算机网络—————考研复试