【多维动态规划】Leetcode 72. 编辑距离【中等】

编辑距离

给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。

你可以对一个单词进行如下三种操作:

  • 插入一个字符
  • 删除一个字符
  • 替换一个字符

示例 1:

输入:word1 = “horse”, word2 = “ros”
输出:3
解释
horse -> rorse (将 ‘h’ 替换为 ‘r’)
rorse -> rose (删除 ‘r’)
rose -> ros (删除 ‘e’)

解题思路

这是一个经典的字符串编辑距离问题,可以使用动态规划来解决。

  • 1、定义一个二维数组dp,其中dp[i][j]表示将word1的前i个字符转换成word2的前j个字符所需的最少操作数。

  • 2、初始化dp数组,dp[i][0]表示将word1的前i个字符转换成空字符串的最少操作数,即删除操作数为i;dp[0][j]表示将空字符串转换成word2的前j个字符的最少操作数,即插入操作数为j。

  • 3、如果 word1[i - 1] 等于 word2[j - 1],则 dp[i][j] = dp[i - 1][j - 1],表示当前字符不需要操作。

  • 4、如果 word1[i - 1] 不等于 word2[j - 1],则
    dp[i][j]= min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]) + 1,表示当前字符需要进行插入、删除或替换操作中的一种。

    对于 dp[i][j],有三种情况分析:

    插入操作(Insertion): 将字符 B[j] 插入到 A 的末尾,使 A 的前 i 个字符与 B 的前 j-1 个字符相匹配,然后再插入 B[j]。因此,操作次数为 dp[i][j-1] + 1。

    删除操作(Deletion): 将 A[i] 字符删除,使 A 的前 i-1 个字符与 B 的前 j 个字符相匹配。因此,操作次数为 dp[i-1][j] + 1。

    替换操作(Substitution): 将 A[i] 替换为 B[j],使 A 的前 i-1 个字符与 B 的前 j-1 个字符相匹配,然后再将 A[i] 替换为 B[j]。因此,操作次数为 dp[i-1][j-1] + (A[i] != B[j])。如果 A[i] 和 B[j] 相同,则不需要进行替换操作,操作次数为 dp[i-1][j-1];如果不相同,则需要进行替换操作,操作次数为 dp[i-1][j-1] + 1。

Java实现

public class EditDistance {public int minDistance(String word1, String word2) {int m = word1.length();int n = word2.length();int[][] dp = new int[m + 1][n + 1];//初始化dp数组第一行和第一列for (int i = 0; i <= m; i++) {dp[i][0] = i;}for (int j = 0; j <= n; j++) {dp[0][j] = j;}// 填充dp数组for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; j++) {if (word1.charAt(i - 1) == word2.charAt(j - 1)) {dp[i][j] = dp[i - 1][j - 1];} else {dp[i][j] = Math.min(Math.min(dp[i - 1][j], dp[i][j - 1]), dp[i - 1][j - 1]) + 1;}}}//return dp[m][n];}public static void main(String[] args) {EditDistance solution = new EditDistance();// Test casesString word1 = "horse";String word2 = "ros";System.out.println(solution.minDistance(word1, word2)); // Output: 3word1 = "intention";word2 = "execution";System.out.println(solution.minDistance(word1, word2)); // Output: 5}
}

时间空间复杂度

  • 时间复杂度:遍历了一次二维数组dp,时间复杂度为O(m * n),其中m和n分别为word1和word2的长度。

  • 空间复杂度:使用了一个二维数组dp,空间复杂度为O(m * n)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/4766.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kali 网络环境设置

一、修改网卡配置 1.1 系统桌面上单击右键&#xff0c;在弹出的菜单中选择 Open Terminal Here。 1.2 输入命令 vim /etc/network/interfaces&#xff0c;显示配置网卡参数为。iface lo 一般指 本地环回接口&#xff0c; iface eth0 网卡为系统正在使用的网卡&#xff0c;其中的…

将后端返回的正则字符串转为正则对象

/*这个正则表示的是输入框前后不得有空格*/ let re v.regex.replace("\n", ""); // 将后端返回的正则字符串转为正则对象 let reg new Function("return " re)(); if (reg.test(v.value) true) { /*所需要写的事件*/ } else { /*空格的时候的…

elementUi中el-date-picker;两个日期选择器第二个必须在第一个之后

<el-row><el-col :span"12"><el-form-item label"实际开始日期" style"margin-top: 10px;" proprealBeginDate><el-date-picker v-model"pmTaskProgressFeedback.realBeginDate" type"date" placehold…

浏览器的本地存储---localstorage

web存储对象 Web 存储对象 localStorage 和 sessionStorage 允许我们在浏览器上保存键/值对。 这两个对象保存再本地&#xff08;客户端&#xff09;&#xff0c;允许保存至少 5MB 的数据&#xff08;或更多&#xff09;&#xff0c;这些数据不会因为页面刷新而销毁&#xff0…

高扬程水泵的性能与应用领域 /恒峰智慧科技

在现代社会中&#xff0c;科技的发展为我们的生活带来了无数便利和可能性。其中&#xff0c;高扬程水泵作为一种高效能的水泵&#xff0c;其独特的设计使其在各个领域都有着广泛的应用&#xff0c;尤其是在森林消防中。 一、高扬程水泵的性能 1. 高扬程&#xff1a;高扬程水泵…

前端深度的技术有哪些?

前端技术的深度涵盖了一系列专业知识、技术栈和实践方法&#xff0c;这些内容可以帮助开发者构建高性能、可维护、用户体验优秀的Web应用程序。以下是前端深度技术的一些关键领域&#xff1a; 1. 现代Web框架与库 React、Vue.js、Angular等主流框架的深入理解和实战经验&#…

TinyML之Hello world----基于Arduino Nano 33 BLE Sense Rev2的呼吸灯

早期版本的Hello World 这应该是一个逼格比较高的呼吸灯了&#xff0c;用ML来实现呼吸灯功能&#xff0c;之前已经有大佬发过类似的文章&#xff1a;https://blog.csdn.net/weixin_45116099/article/details/126310816 当前版本的Hello World 这是一个ML的入门例程&#xff…

C#身份查验接口、身份证文字识别接口、金融身份验证

针对金融领域远程自主开户的实名认证&#xff0c;翔云人工智能开放平台提出了有针对性的解决方案。翔云实名认证API其中包含了身份证实名认证、人脸识别、人证合一和银行卡实名认证&#xff0c;可快速识别提取用户身份信息&#xff0c;实时联网权威数据源进行用户身份的验证&am…

常见面试题总结

1. 苍穹外卖的模块 苍穹外卖大方向上主要分为管理端和用户端 管理端使用vue开发&#xff0c;主要是商家来使用&#xff0c;提供餐品的管理功能&#xff0c;主要有下面几个模块&#xff1a; 员工模块&#xff0c;提供员工账号的登录功能和管理功能 分类、菜品、套餐模块&…

车载域控制器介绍

车载域控制器主要是指用于车辆控制的专用控制器&#xff0c;域代表不同的区域用同一个控制器&#xff0c;包括车身域底盘域&#xff0c;主机等。常用的域控制器主要有基于英伟达orin xavier平台的&#xff0c;基于ti tda4平台的&#xff0c;tc297/397平台的。 域控制器常用的配…

promise笔记

1.介绍 之前的异步编程都是回调函数&#xff08;数据库操作、ajax、定时器、fs读取文件 &#xff09; promise是es6异步编程新的解决方案&#xff0c;是一个构造函数 优点&#xff1a;支持链式调用&#xff0c;可以解决回调地狱&#xff0c;可以指定回调函数 2.使用 functio…

conda环境查看当前可下载的Django版本

要使用conda查看可用的Django版本&#xff0c;你需要使用conda search命令。以下是如何进行操作的步骤&#xff1a; 打开你的终端。输入以下命令&#xff1a; conda search django运行这个命令后&#xff0c;你将看到一个列表&#xff0c;其中包含了在当前配置的conda源中可用…

Seatunnel-2.3.3 自打包 docker部署(含web)

前言 此篇重点是&#xff0c;自己将源码编译后&#xff0c;将打包文件部署在docker里&#xff08;也可以直接用官网的&#xff09; 如果也有人是希望&#xff0c;将自己打包的源码部署了&#xff0c;可以参考可乐的这篇文章&#xff0c;这篇文章详细介绍了2.3.3的serve和web的…

定时任务管理系统详细设计说明书

目录 定时任务管理系统详细设计说明书 1. 概述 2. 系统架构 2.1 技术选型 2.2 系统组件 2.3 安全设计 3. 功能模块设计 3.1 任务查询 3.2 任务创建和修改 3.3 任务暂停和启动 3.4 任务报表导出 4. 数据库设计 4.1 任务表 (tasks) 4.2 任务执行记录表…

SpringCloud之负载均衡Ribbon

Ribbon 是一个客户端负载均衡工具&#xff0c;主要功能是将面向服务的Rest模板&#xff08;RestTemplate&#xff09;请求转换成客户端负载均衡的服务调用。通过Ribbon&#xff0c;开发人员可以在客户端实现请求的负载均衡&#xff0c;而无需单独部署负载均衡器。Ribbon支持多…

在config.json文件中配置出来new mars3d.graphic.PolylineCombine({大量线合并渲染类型的geojson图层

在config.json文件中配置出来new mars3d.graphic.PolylineCombine({大量线合并渲染类型的geojson图层 问题场景&#xff1a; 1.浏览官网示例的时候图层看到大量线数据合并渲染的示例 2.矢量数据较大量级的时候&#xff0c;这种时候怎么在config.json文件中尝试配置呢&#x…

积分管理系统论文

摘  要 随着计算机和网络的不断革新&#xff0c;世界已经进入了前所未有的电子时代。作为实用性强、应用范围广泛的会员管理系统也正在被越来越多的各类企业用于消费管理领域。然而&#xff0c;那些针对性强、企业理念清晰的大型超市也正发展迅速&#xff0c;这些大型超市应该…

软件更新 | TSMaster 2024.04 最新版已上线,来看看新增了哪些实用功能

TSMaster是集汽车总线嵌入式代码生成、监控、仿真、开发、UDS诊断、CCP/XCP标定、ECU刷写、I/O控制、测试测量等功能于一体的国产软件工具。在最新更新的软件版本里&#xff0c;增加了很多新功能&#xff0c;其中期待已久的DoIP诊断功能终于在最新升级版本里可以实现&#xff0…

Redis__数据类型

文章目录 &#x1f60a; 作者&#xff1a;Lion J &#x1f496; 主页&#xff1a; https://blog.csdn.net/weixin_69252724 &#x1f389; 主题&#xff1a;Redis__数据类型 ⏱️ 创作时间&#xff1a;2024年04月28日 ———————————————— 这里写目录标题 文…