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

【算法-力扣】72. 编辑距离(动态规划)

目录

一、题目描述

二、解题思路 

三、参考答案


一、题目描述

      编辑距离

给你两个单词 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 由小写英文字母组成
 

二、解题思路 

   1、首先确定DP数组以及它的含义

        这里我们使用一个二维的DP数组dp[i][j],此时dp[i][j]就表示word1和word2对应的i和j位置结束的时候转换后的最少操作次数。比如word1为abc,word2为dcdb,则dp[1][3]就表示ab转换成dcdb的最少转换次数。这个dp[i][j]的含义一定要记住,不然后面再推导递推公式的时候就很容易把自己绕晕!

   2、如何初始化dp数组

        首先我们要确定,我们要初始化dp数组的哪些位置。因为我们的dp[i][j]表示的是word1和word2对应的i和j位置结束的时候转换后的最少操作次数。所以,最终的我们要的结果也就是dp二维数组的最后一个元素。

 所以,这里我们需要初始化dp数组的第一行和第一列。这样,最终我们才能根据第一行和第一列的数据来推导出来最终的结果。

        那么,问题来了,我们该如何初始化第一行和第一列的数据呢?

       比如,word1为abc,word2为dcdb。我们初始化第一行的时候,那就是要求出a分别转换成d、dc、dcd、dcdb时的最少操作次数。显然这样初始化是非常麻烦的,甚至是不可完成的!那么我们再假设word1为zabc,word2为zdcdb。此时我们初始化第一行的时候,则就是求z分别转换成z、zd、zdc、zdcd、zdcdb时的最少操作次数。显然这个时候就很简单了对应最少操作次数其实就是j的值。

        那么,灵感来了!

        我们只要对word1和word2分别在它的首位置都添加一个相同的字符就行了!因为两个字符相同,所以不会影响我们最终的结果的。此时初始化dp数组就如下:

        // 初始化第一行for (int j = 0; j < n; j++)dp[0][j] = j;// 初始化第一列for (int i = 0; i < m; i++)dp[i][0] = i;

注:m是word1单词的长度,n是word2单词的长度。 

   3、确定递推公式

  • 当前遍历的dp[i][j]对应word1和word2位置上的字符相等的时候

           dp[i][j] = dp[i-1][j-1] 
      此时不需要任何操作,所以此时的 dp[i][j] = dp[i-1][j-1] 

  • 当前遍历的dp[i][j]对应word1和word2位置上的字符不相等的时候,此时就需要进行操作

        1)插入、删除

        插入和删除操作是等价的,比如a和ab我们删除b和添加b操作次数都是一样的。所以这里我们只考虑删除即可。删除有可能删除word1的i位置的元素,也有可能删除word2的j位置的元素,删除word1和删除word2对应的操作次数是不一样的,所以需要比较出一个操作次数少的。
       删除word1的i位置的元素:dp[i][j] = dp[i-1][j]+1
       删除word2的j位置的元素:dp[i][j] = dp[i][j-1]+1 

       此时在当前操作下的最少操作次数就是:

     dp[i][j] =  Math.min(dp[i-1][j]+1, dp[i][j-1]+1);

      如果此时有点晕,一定要再想dp[i][j]代表的是什么!

       2)替换

       替换也就是将word1在i位置的字符替换成word2在j位置的字符或者是将word2在j位置的字符替换成word1在i位置的字符。不管它俩谁替换谁,我们最终关心的只是操作次数。所以,这里也就是1次操作。所以,我们只要在它们俩前一个位置上的时的最少操作次数上面加1,也就是word1和word2在当前位置和当前替换操作下的最少操作次数了。

        dp[i][j] = dp[i-1][j-1]+1

最后,我们求出这些操作中哪个操作次数最少,也就是我们最终该位置上的最少操作次数了。也就是在word1和word2在i和j位置上的字符不相等的时候的递推公式了。

dp[i][j] =  Math.min( dp[i-1][j-1]+1, Math.min(dp[i-1][j]+1, dp[i][j-1]+1));

三、参考答案

class Solution {public int minDistance(String word1, String word2) {// 两个字符串前面都加个空字符串,方便后续初始化二维dp数组word1 = " " + word1;word2 = " " + word2;char[] word1Array = word1.toCharArray();char[] word2Array = word2.toCharArray();int m = word1Array.length, n = word2Array.length;// 定义一个dp二维数组,dp[i][j]表示word1和word2对应的i和j位置的时候最少操作次数int[][] dp = new int[m][n];// 初始化dp数组// 初始化第一行for (int j = 0; j < n; j++)dp[0][j] = j;// 初始化第一列for (int i = 0; i < m; i++)dp[i][0] = i;// 遍历for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {// 当当前位置相等的时候if (word1Array[i] == word2Array[j]) {dp[i][j] = dp[i - 1][j - 1];} else { // 不相等的时候需要处理dp[i][j] = Math.min(Math.min(dp[i][j-1],dp[i-1][j-1]),dp[i-1][j])+1;}}}return dp[m-1][n-1];}
}

       以上就是使用动态规划解决力扣上72题编辑距离的方法。通过使用动态规划,我们可以高效地解决这个问题,时间复杂度为O(m*n),其中m和n分别是字符串word1和word2的长度。编辑距离是一个非常有意义的问题,掌握了解决方法后,我们就可以将其应用到各种实际问题中,提高算法的效率。编辑距离在我们的实际开发中有很多的应用场景,比如拼写纠错、数据对齐、抄袭侦测等。

相关文章:

【算法-力扣】72. 编辑距离(动态规划)

目录 一、题目描述 二、解题思路 三、参考答案 一、题目描述 编辑距离 给你两个单词 word1 和 word2&#xff0c; 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作&#xff1a; 插入一个字符 删除一个字符 替换一个字符 示例 1&#…...

Spring 系统架构图

Spring 系统架构图 Spring Framework是Spring生态圈中最基础的项目&#xff0c;是其他项目的根基。 Spring Framework的发展也经历了很多版本的变更&#xff0c;每个版本都有相应的调整 Spring Framework的5版本目前没有最新的架构图&#xff0c;而最新的是4版本&#xff0c;…...

同三维T80005EHS-4K60 4K60 HDMI/SDI编码器

1路4K60 HDMI或12G SDI输入&#xff0c;2路3.5MM音频输入&#xff0c;对应HDMI或SDI&#xff0c;1个USB口和1个SD卡槽&#xff0c;可录像到U盘/移动硬盘/SSD硬盘/TF卡 产品简介&#xff1a; 同三维T80005EHS-4K60 4K60HDMI/SDI H.265编码器采用最新高效H.265高清数字视频压缩…...

React state(及组件) 的保留与重置

当在树中相同的位置渲染相同的组件时&#xff0c;React 会一直保留着组件的 state return (<div><Counter />{showB && <Counter />} </div> ) // 当 showB 为 false, 第二个计数器停止渲染&#xff0c;它的 state 完全消失了。这是因为 React…...

flask返回的数据怎么是转义后的字符串啊

Flask在返回JSON数据时,默认情况下会对特殊字符进行转义,以确保数据能安全地在HTML页面中展示,避免XSS(跨站脚本攻击)等安全问题。如果不希望Flask对JSON响应中的字符串自动转义,通常是因为你希望在前端直接使用这些数据(例如作为JavaScript的一部分),那么需要确保数据…...

C++17并行算法与HIPSTDPAR

C17 parallel algorithms and HIPSTDPAR — ROCm Blogs (amd.com) C17标准在原有的C标准库中引入了并行算法的概念。像std::transform这样的并行版本算法保持了与常规串行版本相同的签名&#xff0c;只是增加了一个额外的参数来指定使用的执行策略。这种灵活性使得已经使用C标准…...

【什么是几度cms,主要功能有什么】

几度CMS内容管理框架是基于 PHP 语言采用最新 Thinkphp 作为开发框架生产的网站 内容管理框架&#xff0c;提供“电脑网站 手机网站 多终端 APP 接口”一体化网站技术解 决方案。她拥有强大稳定底层框架&#xff0c;以灵活扩展为主的开发理念&#xff0c;二次开发方便且…...

组合和外观模式

文章目录 组合模式1.引出组合模式1.院系展示需求2.组合模式基本介绍3.组合模式原理类图4.解决的问题 2.组合模式解决院系展示1.类图2.代码实现1.AbsOrganizationComponent.java 总体抽象类用于存储信息和定义方法2.University.java 第一层&#xff0c;University 可以管理 Coll…...

设置服务器禁止和ip通信

要禁止服务器与特定 IP 地址的通信&#xff0c;可以使用防火墙来设置规则。在 Ubuntu 上&#xff0c;iptables 是一个常用的防火墙工具。以下是使用 iptables 设置禁止与特定 IP 通信的步骤&#xff1a; 阻止所有进出的通信 如果你想阻止服务器与特定 IP 地址的所有通信&…...

中文技术文档的写作规范(搬运)

阮一峰老师的《中文技术文档的写作规范》搬运。 链接指路&#xff1a; https://github.com/ruanyf/document-style-guide/tree/master 内容&#xff1a;对中文技术文档从标题、文本、段落、数值、标点符号、文档体系、参考链接等七大方面进行了简明扼要的介绍。...

「实战应用」如何用DHTMLX将上下文菜单集成到JavaScript甘特图中(一)

DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的所有需求&#xff0c;是最完善的甘特图图表库。 DHTMLX Gantt是一个高度可定制的工具&#xff0c;可以与项目管理应用程序所需的其他功能相补充。在本文中您将学习如何使用自定义上…...

Python使用策略模式生成TCP数据包

使用策略模式&#xff08;Strategy Pattern&#xff09;来灵活地生成不同类型的TCP数据包。 包括三次握手、数据传输和四次挥手。 from scapy.all import * from scapy.all import Ether, IP, TCP, UDP, wrpcap from abc import ABC, abstractmethodclass TcpPacketStrategy(A…...

无文件落地分离拆分-将shellcode从文本中提取-file

马子分为shellcode和执行代码. --将shellcode单独拿出,放在txt中---等待被读取执行 1-cs生成python的payload. 2-将shellcode进行base64编码 import base64code b en_code base64.b64encode(code) print(en_code) 3-将编码后的shellcode放入文件内 4-读取shellcod…...

MySQL 日志(一)

本篇主要介绍MySQL日志的相关内容。 目录 一、日志简介 常用日志 一般查询日志和慢查询日志的输出形式 日志表 二、一般查询日志 三、慢查询日志 四、错误日志 一、日志简介 常用日志 在MySQL中常用的日志主要有如下几种&#xff1a; 这些日志通常情况下都是关闭的&a…...

XML 编辑器:功能、选择与使用技巧

XML 编辑器&#xff1a;功能、选择与使用技巧 简介 XML&#xff08;可扩展标记语言&#xff09;是一种用于存储和传输数据的标记语言。由于其灵活性和广泛的应用&#xff0c;XML编辑器成为开发者、数据管理者和内容创作者的重要工具。本文将探讨XML编辑器的功能、选择标准以及…...

单例模式(设计模式)

文章目录 概述1. 饿汉式&#xff08;hungry Initialization&#xff09;2. 懒汉式&#xff08;Lazy Initialization&#xff09;3.双重检查锁定&#xff08;Double-Checked Locking&#xff09;4. 静态内部类&#xff08;Static Inner Class&#xff09;5. 枚举&#xff08;Enu…...

提升你的编程体验:自定义 PyCharm 背景图片

首先&#xff0c;打开 PyCharm 的设置菜单&#xff0c;点击菜单栏中的 File > Settings 来访问设置&#xff0c;也可以通过快捷键 CtrlAItS 打开设置。 然后点击Appearance & Behavior > Appearance。 找到Background image...左键双击进入。 Image:传入自己需要设置…...

SpringCloud与Dubbo区别?

相同点: dubbo与springcloud都可以实现RPC远程调用。 dubbo与springcloud都可以使用分布式、微服务场景下。 区别: dubbo有比较强的背景,在国内有一定影响力。 dubbo使用zk或redis作为作为注册中心 springcloud使用eureka作为注册中心 dubbo支持多种协议&#xff0c;默认使用…...

简单Mesh多线程合并,使用什么库性能更高

1&#xff09;简单Mesh多线程合并&#xff0c;使用什么库性能更高 2&#xff09;Unity Semaphore.WaitForSignal耗时高 3&#xff09;VS编辑的C#代码注释的中文部分乱码 4&#xff09;变量IntPtr m_cachePtr切换线程后变空 这是第389篇UWA技术知识分享的推送&#xff0c;精选了…...

长亭培训加复习安全产品类别

下面这个很重要参加hw时要问你用的安全产品就有这个 检测类型产品 偏审计 安全防御类型 EDR类似于杀毒软件 安全评估 任何东西都要经过这个机械勘察才能上线 安全管理平台 比较杂 比较集成 审计 漏扫 评估 合在这一个平台 也有可能只是管理 主机理解为一个电脑 安了终端插件…...

SuGaR与NeRF对比分析:为什么高斯泼溅是未来趋势

SuGaR与NeRF对比分析&#xff1a;为什么高斯泼溅是未来趋势 【免费下载链接】SuGaR [CVPR 2024] Official PyTorch implementation of SuGaR: Surface-Aligned Gaussian Splatting for Efficient 3D Mesh Reconstruction and High-Quality Mesh Rendering 项目地址: https://…...

企业级OA系统高可用方案:泛微ecology+Nginx负载均衡最佳实践

企业级OA系统高可用架构设计与实践&#xff1a;泛微ecologyNginxResin全栈解决方案 在数字化转型浪潮中&#xff0c;办公自动化系统(OA)已成为企业核心IT基础设施。作为国内领先的协同管理平台&#xff0c;泛微ecology承载着企业关键业务流程&#xff0c;其稳定性直接影响组织运…...

OpenWRT路由器如何用Zerotier实现异地组网?保姆级配置教程(含防火墙规则详解)

OpenWRT路由器通过Zerotier构建安全异地内网的完整实践指南 异地办公已成为现代企业的常态&#xff0c;而如何安全高效地访问公司内网资源则是技术人员面临的现实挑战。传统VPN方案往往配置复杂且性能受限&#xff0c;而基于P2P技术的Zerotier配合OpenWRT路由器&#xff0c;能够…...

环境管理从未如此简单:Miniconda-Python3.9镜像快速入门指南

环境管理从未如此简单&#xff1a;Miniconda-Python3.9镜像快速入门指南 1. 为什么选择Miniconda-Python3.9镜像 Python作为当今最流行的编程语言之一&#xff0c;在数据科学、机器学习和Web开发等领域有着广泛应用。但Python环境管理一直是开发者面临的痛点之一&#xff0c;…...

终极网络工具集实战:ACL库中DNS解析、Ping检测与邮件发送的完整解决方案

终极网络工具集实战&#xff1a;ACL库中DNS解析、Ping检测与邮件发送的完整解决方案 【免费下载链接】acl A powerful server and network library, including coroutine, redis client, http, websocket, mqtt with C/C for multi-platform including Linux, Android, iOS, Ma…...

深度解析JiYuTrainer:极域电子教室反控制技术实现与架构设计

深度解析JiYuTrainer&#xff1a;极域电子教室反控制技术实现与架构设计 【免费下载链接】JiYuTrainer 极域电子教室防控制软件, StudenMain.exe 破解 项目地址: https://gitcode.com/gh_mirrors/ji/JiYuTrainer JiYuTrainer是一款专业的极域电子教室反控制软件&#xf…...

Python 3.14 JIT为何在ARM64上降频17%?源码级定位_pyltopt_arch.c中2个未对齐的寄存器分配bug(已提交CPython PR#12894)

第一章&#xff1a;Python 3.14 JIT编译器性能降频现象概览Python 3.14 引入的实验性 JIT 编译器&#xff08;基于 Pyjion 与新式 AST 优化管道&#xff09;在部分工作负载下表现出非预期的性能降频现象——即启用 JIT 后&#xff0c;某些计算密集型循环或 I/O 绑定协程的执行耗…...

Mac用户福音:Qwen3-TTS声音克隆在ComfyUI上的M芯片优化方案

Mac用户福音&#xff1a;Qwen3-TTS声音克隆在ComfyUI上的M芯片优化方案 1. 为什么Mac用户需要特别优化方案 苹果M系列芯片凭借其出色的能效比和统一内存架构&#xff0c;已经成为许多创意工作者的首选。然而&#xff0c;在运行AI模型时&#xff0c;特别是像Qwen3-TTS这样的语…...

Lychee-rerank-mm在音乐推荐中的创新应用

Lychee-rerank-mm在音乐推荐中的创新应用 1. 引言 你有没有遇到过这样的情况&#xff1a;在音乐平台上听到一首很喜欢的歌&#xff0c;想找类似的音乐&#xff0c;但系统推荐的歌曲却总是差强人意&#xff1f;要么封面风格完全不搭&#xff0c;要么歌词主题南辕北辙&#xff…...

Phi-3-mini-4k-instruct-gguf效果实测:128ms首token延迟+98%中文基础任务通过率

Phi-3-mini-4k-instruct-gguf效果实测&#xff1a;128ms首token延迟98%中文基础任务通过率 1. 开篇&#xff1a;轻量级文本生成新选择 最近测试了微软Phi-3系列中的轻量级选手——Phi-3-mini-4k-instruct-gguf模型&#xff0c;结果让人惊喜。这个专门优化过的GGUF版本&#x…...