LeetCode算法题解(动态规划)|LeetCode583. 两个字符串的删除操作、LeetCode72. 编辑距离

一、LeetCode583. 两个字符串的删除操作

题目链接:583. 两个字符串的删除操作
题目描述:

给定两个单词 word1 和 word2 ,返回使得 word1 和  word2 相同所需的最小步数

每步 可以删除任意一个字符串中的一个字符。

示例 1:

输入: word1 = "sea", word2 = "eat"
输出: 2
解释: 第一步将 "sea" 变为 "ea" ,第二步将 "eat "变为 "ea"

示例  2:

输入:word1 = "leetcode", word2 = "etco"
输出:4

提示:

  • 1 <= word1.length, word2.length <= 500
  • word1 和 word2 只包含小写英文字母
算法分析:
定义dp数组及下标含义:

dp[i][j]表示以下标i结尾的word1字符串和以下标j结尾的word2字符串,删除至相同所需的最小步骤。

递推公式:

如果word1[i]==word2[j],无需进行删除操作,那么dp[i][j] == dp[i-1][j-1];

如果word1[i] !=word2[j],那么dp[i][j]可以由三个方向推导出来:

1、删除word1[i],删除word2[j],两个步骤,即dp[i][j]=dp[i-1][j-1]+2;

2、删除word1[i],word2[j]继续匹配,一个步骤,即dp[i][j]=dp[i-1][j]+1;

3、删除word2[j],word1[i]继续匹配,一个步骤,即dp[i][j]=dp[i][j-1]+1;

所以dp[i][j]=max(dp[i-1][j-1]+2,dp[i-1][j]+1,dp[i][j-1]+1);

初始化:

由递推公式可知,dp需要初始化第一行和第一列。

        for(int j = 0; j < word2.length(); j++){if(word1.charAt(0) == word2.charAt(j)){//如果相等,那么word1[0]和以下标j结尾的word2字符串相同所需的操作步骤为j,即删掉除word2[j]之前的所有字符。dp[0][j] = j;}else{//如果不相等,当j == 0 的时候,需要删除word1[0]和word2[0],2个步骤//当j!=0时,在之前步骤的基础上,删除word2[j],加一个步骤。if(j > 0) dp[0][j] = dp[0][j-1] + 1;else dp[0][j] = 2;}}for(int i = 0; i < word1.length(); i++){//第一列同理if(word1.charAt(i) == word2.charAt(0)){dp[i][0] = i;}else{if(i > 0) dp[i][0] = dp[i-1][0] + 1;else dp[i][0] = 2;}}
遍历顺序:

word1和word2的哪个先遍历都无所谓,只要都是从前往后遍历。

打印dp数组进行验证。

代码如下:

class Solution {public int minDistance(String word1, String word2) {int[][] dp = new int[word1.length()][word2.length()];for(int j = 0; j < word2.length(); j++){if(word1.charAt(0) == word2.charAt(j)){//如果相等,那么word1[0]和以下标j结尾的word2字符串相同所需的操作步骤为j,即删掉除word2[j]之前的所有字符。dp[0][j] = j;}else{//如果不相等,当j == 0 的时候,需要删除word1[0]和word2[0],2个步骤//当j!=0时,在之前步骤的基础上,删除word2[j],加一个步骤。if(j > 0) dp[0][j] = dp[0][j-1] + 1;else dp[0][j] = 2;}}for(int i = 0; i < word1.length(); i++){//第一列同理if(word1.charAt(i) == word2.charAt(0)){dp[i][0] = i;}else{if(i > 0) dp[i][0] = dp[i-1][0] + 1;else dp[i][0] = 2;}}for(int i = 1; i < word1.length(); i++) {for(int j = 1; j < word2.length(); j++) {if(word1.charAt(i) == word2.charAt(j)){//相等时由左上方推出来dp[i][j] = dp[i-1][j-1];}else{//不相等时由左方、上方、左上方推出来dp[i][j] = Math.min(dp[i-1][j-1] + 2,Math.min(dp[i-1][j] + 1,dp[i][j-1] + 1));}}}return dp[word1.length()-1][word2.length()-1];}
}

二、LeetCode72. 编辑距离

题目链接: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 由小写英文字母组成
算法分析:
定义dp数组及下标含义:

dp[i][j]表示以下标i结尾的字符串word1转换成以下标j结束的字符串word2所需的最少操作步骤。

递推公式:

当word1[i]==word2[j]时,无需任何操作,即dp[i][j]=dp[i-1][j-1];

当word1[i]!=word2[j]时,可以有三种操作:

1、替换word1[i]元素,使之与word2[j]相等,即dp[i][j]=dp[i-1][j-1]+1;

2、删除word1[i]元素,即dp[i][j]=dp[i-1][j] + 1;

3、在word1[i]元素之后插入一个元素,使该元素与word2[j]相等,那么即dp[i][j]=dp[i][j-1]+1;

初始话:

根据递推公式初始化dp数组的第一行和第一列。

        boolean flag = false;for(int j = 0; j < word2.length(); j++) {if(word1.charAt(0) == word2.charAt(j)){//如果相等,那么word1[0]转化成以j结尾的word2字符串所需操作数为j,即添加j个数,注意j是从0开始的。dp[0][j] = j;flag = true;}else{//如果不相等,当word2[j]之前有出现过word1[0]时,只需操作j步,即在word1[0]添加j个数//当word2[j]之前没有出现果word1[0]时,需要操作j+1步,即将word1[0]转化成word1[0],再添加j个数if(flag) dp[0][j] = j;else dp[0][j] = j + 1;}}flag = false;for(int i = 0; i < word1.length(); i++) {//初始化第一列同理if(word1.charAt(i) == word2.charAt(0)){dp[i][0] = i;flag = true;}else{if(flag) dp[i][0] = i;else dp[i][0] = i + 1;}}
遍历顺序:

word1和word2哪个先遍历没关系,但都需从前往后遍历。

打印dp数组进行验证。

代码如下:

class Solution {public int minDistance(String word1, String word2) {if(word1.length() == 0) return word2.length();if(word2.length() == 0) return word1.length();int[][] dp = new int[word1.length()][word2.length()];boolean flag = false;for(int j = 0; j < word2.length(); j++) {if(word1.charAt(0) == word2.charAt(j)){//如果相等,那么word1[0]转化成以j结尾的word2字符串所需操作数为j,即添加j个数,注意j是从0开始的。dp[0][j] = j;flag = true;}else{//如果不相等,当word2[j]之前有出现过word1[0]时,只需操作j步,即在word1[0]添加j个数//当word2[j]之前没有出现果word1[0]时,需要操作j+1步,即将word1[0]转化成word1[0],再添加j个数if(flag) dp[0][j] = j;else dp[0][j] = j + 1;}}flag = false;for(int i = 0; i < word1.length(); i++) {//初始化第一列同理if(word1.charAt(i) == word2.charAt(0)){dp[i][0] = i;flag = true;}else{if(flag) dp[i][0] = i;else dp[i][0] = i + 1;}}for(int i = 1; i < word1.length(); i++) {for(int j = 1; j < word2.length(); j++) {if(word1.charAt(i) == word2.charAt(j)) {//如果相等,无需操作dp[i][j] = dp[i-1][j-1];}else{//如果不相等,再三个操作当中取步骤最少的操作数。dp[i][j] = Math.min(dp[i-1][j-1] + 1, Math.min(dp[i-1][j] + 1, dp[i][j-1] + 1));}}}// for(int i = 0; i < word1.length(); i++) {//     for(int j = 0; j < word2.length(); j++) {//         System.out.print(dp[i][j] + " ");//     }//     System.out.println();// }return dp[word1.length()-1][word2.length()-1];}
}

总结

这两道题比较类似,只要会其中一道题,两外一个也很容易想出来。

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

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

相关文章

固态硬盘的优势是什么?

固态硬盘的优势是什么&#xff1f; 1、重量轻体积小。固态硬盘相比机械硬盘在体积上更小&#xff0c;重量更轻。一般来说&#xff0c;台式机的机械硬盘的尺寸在3.5英寸&#xff0c;而SATA接口的固态硬盘的尺寸仅有2.5英寸&#xff0c;而M.2接口的固态硬盘体积更小&#xff0c;只…

听力长难句

[ 01 ] Usually, when we think of DNA, we think of the DNA Thats in cells nucleus, but in fact a cell mitochondrion also contains DNA. In this particular situation, mitochondrial DNA analysis made more sense than nuclear DNA analysis. 翻译&#xff1a; 通…

新手管理者有哪些需要学习的内容?

作为新手管理者&#xff0c;需要学习的内容非常多。以下是一些重要的学习内容&#xff1a; 1. 领导力和管理技能&#xff1a;作为管理者&#xff0c;首先要学习如何有效地领导和管理团队。这包括学习如何激励员工、制定目标和计划、分配任务、解决冲突等。管理者需要具备良好的…

解决Ubuntu使用supervisor管控的程序不能使用麦克风的问题

项目场景&#xff1a; Ubuntu服务器有时候可能更多的是用来跑服务&#xff0c;但是如果用来调取麦克风又担心自己的程序崩溃掉&#xff0c;你可能自然想到使用supervisor来管控自己的程序&#xff0c;但是似乎并不是那么好用。 问题描述 Ubuntu正常使用机器的能力是没有问题的…

【医疗设备方案】脉搏式血氧仪方案

脉搏式血氧仪的主要测量数据分别是血氧饱和度、脉率、血流灌注指数。其中血氧饱和度是指在全部血容量中被结合氧气容量占全部可结合的氧气容量的百分比&#xff0c;是临床医疗上重要的基础数据之一。 脉搏式血氧仪测量原理 典型的脉搏式血氧仪带有一颗光电二极管PD和两颗发光二…

亚马逊云科技re:Invent大会:RAG技术赋能企业AI应用的新纪元

在最新一届re:Invent大会中&#xff0c;亚马逊云科技的数据和人工智能副总裁Swami Sivasubramanian博士提出了一系列AI产品&#xff0c;其中RAG技术成为了企业构建生成式AI应用的重要选择。这种技术的实质是将向量数据库与大语言模型相结合&#xff0c;赋予大模型记忆的能力&am…

LangChain的函数,工具和代理(五):Tools Routing

关于langchain的函数、工具、代理系列的博客我之前已经写了四篇&#xff0c;还没有看过的朋友请先看一下&#xff0c;这样便于对后续博客内容的理解&#xff1a; LangChain的函数&#xff0c;工具和代理(一)&#xff1a;OpenAI的函数调用 LangChain的函数&#xff0c;工具和代…

2023最全的Web自动化测试介绍(建议收藏)

做测试的同学们都了解&#xff0c;做Web自动化&#xff0c;我们主要用Selenium或者是QTP。 有的人可能就会说&#xff0c;我没这个Java基础&#xff0c;没有Selenium基础&#xff0c;能行吗&#xff1f;测试虽然属于计算机行业&#xff0c;但其实并不需要太深入的编程知识&…

C++模板初阶

文章目录 泛型编程函数模板格式模板调用的是同一个函数吗&#xff1f;模板的实现原理T不明确模板实例化的函数和普通函数 类模板类模板写法类模板用法 注意事项 泛型编程 假如我们要写一个两数交换的函数&#xff0c;按我们之前学的知识&#xff0c;我们会这样。 void Swap(i…

TypeScript 在前端开发中的应用范围有哪些?

引言 TypeScript是一种由Microsoft开发的开源编程语言&#xff0c;它是JavaScript的超集&#xff0c;添加了静态类型和其他一些面向对象的特性。在前端开发中&#xff0c;TypeScript的应用范围非常广泛&#xff0c;它不仅提供了更好的开发工具支持&#xff0c;还在代码质量、可…

微信小程序基础bug

1.苹果11手机小程序请求数据不显示 设置-》隐私-》分析与改进-》开启 ”与开发者共享“ 2.<navigator>组件回退delta不成功 tabBar 页面是不能实现后退的效果的. 因为, 当我们跳转到 tabBar 页面&#xff0c;会关闭其他所有非tabBar 页面,所以当处于 tabBar 页面时, 无…

SAP ABAP 通过右键菜单完成Tree Control 节点的增删改功能

通过右键菜单完成Tree Control 节点的增删改功能 Tree 节点的增删改是很重要的功能&#xff0c;包括&#xff1a;增加本级节点&#xff0c;增加子节点&#xff0c;修改节点&#xff0c;删 除节点。完成后效果如下&#xff1a; 选择根节点&#xff0c;单击右键&#xff0c;弹…

peertalk Usbmux 资料收集与整理

Usbmux - The iPhone Wiki Usbmux During normal operations, iTunes communicates with the iPhone using something called “usbmux” – this is a system for multiplexing several “connections” over one USB pipe. Conceptually, it provides a TCP-like system –…

高压功率放大器产品参数及优势有哪些

高压功率放大器是一种关键性能器件&#xff0c;常用于不同领域的应用&#xff0c;包括声音放大、通信系统、电力传输等。以下是关于高压功率放大器产品参数和优势的详细介绍。 一、高压功率放大器的产品参数 输入/输出电压范围&#xff1a;高压功率放大器通常能够承受较高的输入…

金融科技Q3增长密码:结构调优,质量增厚

来源 | 镭射财经&#xff08;leishecaijing&#xff09; 金融科技上市公司三季度交出规模突破、业绩稳增的答卷&#xff0c;为四季度审慎经营、风控优化创造了空间。 从三季度业绩数据看&#xff0c;金融科技行业延续了前两个季度的增长势头&#xff0c;主要金融科技上市公司…

每日汇评:由于美国ADP就业数据疲弱,黄金的反弹可能会延续

在美元全面回落的背景下&#xff0c;金价在2020美元附近跃跃欲试。&#xff1b; 黄金价格的上涨似乎受到美债正收益率的限制&#xff1b; 黄金价格等待美国ADP就业数据获得新的提振&#xff0c;因为技术支撑仍然存在&#xff1b; 周三早盘&#xff0c;金价在2020美元附近小幅反…

处理数据时注意事项

数据安全&#xff1a; 历史数据兼容 越权访问 数据量级 操作记录

完美解决:wget命令下载时遇到“错误 308:Permanent Redirect。”

目录 1 问题 2 解决方法 1 问题 使用wget命令下载时候遇到&#xff1a; --2023-12-02 20:36:08-- http://mirrors.jenkins.io/war-stable/latest/jenkins.war 正在解析主机 mirrors.jenkins.io (mirrors.jenkins.io)... 20.7.178.24, 2603:1030:408:5::15a 正在连接 mirror…

电子版简历模板精选5篇

电子版简历模板模板下载&#xff08;可在线编辑制作&#xff09;&#xff1a;做好简历&#xff0c;来幻主简历。 电子版简历1&#xff1a; 求职意向 求职类型&#xff1a;全职 意向岗位&#xff1a;ERP咨询顾问 意向城市&#xff1a;北京市 薪资要求&#xff1a;…

ROS 欧拉角

在ROS中&#xff0c;欧拉角&#xff08;Euler angles&#xff09;通常用于描述一个物体相对于参考坐标系的旋转。这种表示方法基于三个连续的旋转角度&#xff0c;每个角度对应于绕着特定轴线&#xff08;通常是XYZ轴或ZYZ轴等不同顺序&#xff09;的旋转。 ROS中&#xff0c;…