代码随想录算法训练营第五十六天|583. 两个字符串的删除操作、72. 编辑距离

代码随想录算法训练营第五十六天|583. 两个字符串的删除操作、72. 编辑距离

两个字符串的删除操作

583. 两个字符串的删除操作
文章讲解:https://programmercarl.com/0583.%E4%B8%A4%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E5%88%A0%E9%99%A4%E6%93%8D%E4%BD%9C.html
题目链接:https://leetcode.cn/problems/delete-operation-for-two-strings/
视频讲解:https://www.bilibili.com/video/BV1we4y157wB/

自己看到题目的第一想法

  • dp数组下标和定义:
    • dp[i][j]:i-1位置的word1下,j-1位置下的word2下相同所需的最小步数(删除多少元素)。
  • 推导公式:
    • 相等的情况下,不需要删除,和前面2位i-1 j-1的值一样大
      • word1[i - 1] == word2[j - 1],dp[i][j] = dp[i-1][j-1]
    • 不相等的情况下,需要删除,可以删除i也可以删除j,删除i时最小值要加1 删除j最小值也要加一
      • word1[i - 1] != word2[j - 1],dp[i][j] = Math.min(dp[i-1][j] + 1,dp[i][j-1] + 1)
  • 初始化值:因为是取的坐上和左边上边,因此要求出dp[i][0]和dp[0][j]的值
    • dp[i][0]的值直接取i的值,dp[0][j]的值直接取j的值。
    • for(int i = 0; i <= charWord1.length; i++) dp[i][0] = i;
    • for(int j = 0; j <= charWord2.length; j++) dp[0][j] = j;
  • 遍历顺序:因为是从小到大,因此从0开始遍历
public int minDistance(String word1, String word2) {// dp数组下标和定义// dp[i][j]:i-1位置的word1下,j-1位置下的word2下相同所需的最小步数(删除多少元素)。// 推导公式// 相等的情况下,不需要删除,和前面2位i-1 j-1的值一样大// word1[i - 1] == word2[j - 1],dp[i][j] = dp[i-1][j-1]// 不相等的情况下,需要删除,可以删除i也可以删除j,删除i时最小值要加1 删除j最小值也要加一// word1[i - 1] != word2[j - 1],dp[i][j] = Math.min(dp[i-1][j] + 1,dp[i][j-1] + 1)char[] charWord1 = word1.toCharArray();char[] charWord2 = word2.toCharArray();int[][] dp = new int[charWord1.length + 1][charWord2.length + 1];for(int i = 0; i <= charWord1.length; i++){dp[i][0] = i;}for(int j = 0; j <= charWord2.length; j++){dp[0][j] = j;}for(int i = 1; i <= charWord1.length; i++){for(int j = 1; j <= charWord2.length; j++){if(charWord1[i - 1] == charWord2[j - 1]){dp[i][j] = dp[i-1][j-1];}else{dp[i][j] = Math.min(dp[i-1][j] + 1,dp[i][j-1] + 1);}}}return dp[charWord1.length][charWord2.length];
}

看完代码随想录之后的想法

不想等的时候有3种情况,我只考虑到了2种情况。
三种情况:
情况一:删word1[i - 1],最少操作次数为dp[i - 1][j] + 1

情况二:删word2[j - 1],最少操作次数为dp[i][j - 1] + 1

情况三:同时删word1[i - 1]和word2[j - 1],操作的最少次数为dp[i - 1][j - 1] + 2。
递推公式:dp[i][j] = min({dp[i - 1][j - 1] + 2, dp[i - 1][j] + 1, dp[i][j - 1] + 1});
又因为 dp[i][j - 1] + 1 = dp[i - 1][j - 1] + 2 。所以递推公式dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1);

自己实现过程中遇到哪些困难

ac

编辑距离

72. 编辑距离
文章讲解:https://programmercarl.com/0072.%E7%BC%96%E8%BE%91%E8%B7%9D%E7%A6%BB.html
题目链接:https://leetcode.cn/problems/edit-distance/
视频讲解:https://www.bilibili.com/video/BV1qv4y1q78f/

自己看到题目的第一想法

动态规划
确定dp数组以及下标定义
dp[i][j]:i-1位置的word1下j-1的位置的word2下的word1转成word2所使用的最小操作数。
不能纬数组分3种情况,只能二维数组分3种情况,每次判断长度,长的话删除,短的话插入,相同的话更换
确定递推公式
这里就推导不出来了

看完代码随想录之后的想法

  1. dp数组定义和自己看到题目时的想法一致:dp[i][j]:i-1位置的word1下j-1的位置的word2下的word1转成word2所使用的最小操作数。
  2. 递推公式:
    分两种情况,word1[i-1] == word2[j-1]以及 word1[i-1] != word2[j-1]。
    相等时:dp[i][j] = dp[i-1][j-1]。
    不相等时:
    分三种情况:插入一个字符;删除一个字符;替换一个字符。
    因为插入和删除所需的操作是一样的,因此上述三种情况只考虑删除和替换就可以了。
    删除的情况分2种,删word1和删word2。dp[i][j] = dp[i-1][j] + 1和dp[i][j-1] + 1。
    替换的情况只分一种,因为替换要把word1的位置转换成word2,dp[i][j] = dp[i-1][j] + 1。
  3. 初始化值,因为递推左上角往右边推,因此dp[i][0] = i;dp[0][j] = j;

自己实现过程中遇到哪些困难

删除的逻辑自己能理解并写出来,替换的逻辑没理解对,还要看一下替换的逻辑。
替换逻辑:替换元素,word1替换word1[i - 1],使其与word2[j - 1]相同,此时不用增删加元素。回顾一下,if (word1[i - 1] == word2[j - 1])的时候我们的操作 是 dp[i][j] = dp[i - 1][j - 1] 。那么只需要一次替换的操作,就可以让 word1[i - 1] 和 word2[j - 1] 相同。所以 dp[i][j] = dp[i - 1][j - 1] + 1;

public int minDistance(String word1, String word2) {char[] charWord1 = word1.toCharArray();char[] charWord2 = word2.toCharArray();int[][] dp = new int[charWord1.length + 1][charWord2.length + 1];for(int i = 0; i <= charWord1.length; i++){dp[i][0] = i;}for(int j = 0; j <= charWord2.length; j++){dp[0][j] = j;}for(int i = 1; i <= charWord1.length; i++){for(int j = 1; j <= charWord2.length; j++){if(charWord1[i - 1] == charWord2[j - 1]){// 相等时,只用取前一个节点的值dp[i][j] = dp[i-1][j-1];}else{// 不相等时分2种情况,删和替换// 删dp[i][j] = Math.min(dp[i-1][j] + 1,dp[i][j-1] + 1);// 替换dp[i][j] = Math.min(dp[i][j],dp[i - 1][j - 1] + 1);}}}return dp[charWord1.length][charWord2.length];
}

今日收获&学习时长

距离问题的核心就是定义成i-1,j-1时的位置的最xx值。然后再按照i-1和j-1是否来相等来处理递推逻辑,所有的距离问题都是这样处理的,无非是相等、不等时又分不同的子情况,整体还是都一样的。

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

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

相关文章

虚拟机安装宝塔的坑

问题&#xff1a; 在虚拟机中centos7和centos8中安装宝塔之后&#xff0c;无法访问面板。 解决&#xff1a; 1.先关闭防火墙&#xff08;如果本机能够ping通相关端口&#xff0c;则不用关闭防火墙&#xff09; 2.最新的宝塔会自动开启ssl协议&#xff0c;需要手动关闭。…

Python连接数据库的梳理

我们通常用的数据库类型主要有关系型数据库&#xff0c;非关系型数据库等&#xff0c;其中关系型数据库主要有Microsoft SQL Server ,MySQL,Oracle&#xff0c;SQLite等&#xff0c;常用的非关系型数据库包括Redis、DynamoDB&#xff0c;MongoDB等 ​​​​​​​ 一 关系型…

MongoDB之索引

常用命令 查看表的索引 db.<table>.getIndexes() 查看表索引的大小 db.<table>.totalIndexSize() 重建索引 db.<table>.reIndex() 删除索引 db.COLLECTION_NAME.dropIndex("INDEX-NAME") db.COLLECTION_NAME.dropIndexes() _id 索引无法删…

MCU最小系统原理图中四个问题详解——芯片中有很多电源管脚的原因(VDD/VSS/VBAT)、LC滤波、两级滤波、NC可切换元件

前言&#xff1a;本文对MCU最小系统原理图中的四个问题进行详解&#xff1a;芯片中有很多电源管脚的原因&#xff08;VDD/VSS/VBAT&#xff09;、LC滤波、两级滤波、NC可切换元件。本文以GD32F103C8T6最小系统原理图举例 目录&#xff1a; 芯片中有很多电源管脚的原因&#x…

echarts dataZoom实现左右滑动与放大缩小 并精确控制显示几条数据

//Xdata是横轴的长度&#xff08;若x轴80条数据&#xff0c;默认显示最新的20条&#xff09; var start Xdata.length - 20; var end Xdata.length - 1; dataZoom: [ type: slider, show: true, startValue: dataZoomStart, endValue: dataZoomEnd, dataBackground: { ar…

ESP-IDF Modbus从站例子

支持的芯片型号ESP32ESP32-C2ESP32-C3ESP32-C6ESP32-H2ESP32-S2ESP32-S3 Modbus从站例子 此示例演示了使用FreeModbus协议栈来实现ESP32作为从站设备来进行通信&#xff0c; 该示例允许外部 Modbus主站使用 Modbus协议读取/写入的从站设备参数&#xff0c; “mb_example_comm…

Webpack5入门到原理20:Vue 脚手架搭建

开发模式配置 // webpack.dev.js const path require("path"); const ESLintWebpackPlugin require("eslint-webpack-plugin"); const HtmlWebpackPlugin require("html-webpack-plugin"); const { VueLoaderPlugin } require("vue-lo…

STL——list

1、list介绍 1. list 是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2. list 的底层是带头双向循环链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向其前一个元素和后…

CVE-2023-46226 Apache iotdb远程代码执行漏洞

项目介绍 Apache IoTDB 是针对时间序列数据收集、存储与分析一体化的数据管理引擎。它具有体量轻、性能高、易使用的特点&#xff0c;完美对接 Hadoop 与 Spark 生态&#xff0c;适用于工业物联网应用中海量时间序列数据高速写入和复杂分析查询的需求。 项目地址 https://io…

Leetcoder Day9|栈与队列part01

语言&#xff1a;Java/C 目录 理论基础 C 栈 队列 Java 栈 队列 ​编辑 232.用栈实现队列 225. 用队列实现栈 Queue Deque 今日心得 理论基础 又是考研时数据结构里接触到的老朋友&#xff0c;栈是先进后出&#xff0c;队列是先进先出。 C 现在刷题除了思路还…

力扣-202. 快乐数解析-弗洛伊德循环查找算法

题目链接 public static void Happy(int n) {int sum 0;int digit 0;for (int i 0; i < 20; i) {while (n ! 0) {digit n%10;sum digit*digit;n/10;}System.out.print(sum " ");n sum;sum 0;}} 使用代码测试一下每一代数字 n 2 : 4 16 37 58 89 145 42 …

【笔记】Helm-3 主题-9 Helm高级技术

Helm高级技术 这部分解释说明了使用Helm的各种高级特性和技术。这部分旨在为Helm的高级用户提供高度自定义和操作chart及发布的信息。每个高级特性都会有它自己的权衡利弊&#xff0c; 因此每个使用它们的都要有Helm的深度知识并小心使用。或者换言之&#xff0c;谨记 Peter Pa…

医院挂号系统

需求&#xff1a; 科室管理&#xff1a;新增科室。医生管理&#xff1a;录入医生信息&#xff0c;以及科室信息。修改医生信息&#xff08;主要是修改个人信息和科室&#xff09;。坐诊信息设置&#xff1a;可以设置医生当天和未来6天的坐诊情况&#xff0c;包括上午和下午的坐…

自然语言处理(Natural Language Processing,NLP)解密

专栏集锦&#xff0c;大佬们可以收藏以备不时之需&#xff1a; Spring Cloud 专栏&#xff1a;http://t.csdnimg.cn/WDmJ9 Python 专栏&#xff1a;http://t.csdnimg.cn/hMwPR Redis 专栏&#xff1a;http://t.csdnimg.cn/Qq0Xc TensorFlow 专栏&#xff1a;http://t.csdni…

Servlet中service()与doGet() doPost() 是什么关系

Servlet&#xff08;Server Applet&#xff09;&#xff0c;全称Java Servlet。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据&#xff0c;生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口&#xff0c;广义的Servlet是指任何实现了这个Servlet…

关于去除信号中的直流分量效果演示(零频率分量)

本文作者&#xff1a; slience_me 文章目录 关于去除信号中的直流分量效果演示&#xff08;零频率分量&#xff09;1. 效果图展示&#xff1a;2. 快速傅里叶变换FFT3. 相关验证代码 关于去除信号中的直流分量效果演示&#xff08;零频率分量&#xff09; 1. 效果图展示&#x…

JDK 动态代理(Spring AOP 的原理)(面试重点)

代理模式 也叫委托模式.定义&#xff1a;为其他对象提供⼀种代理以控制对这个对象的访问.它的作⽤就是通过提供⼀个代理类,让我们 在调⽤⽬标⽅法的时候,不再是直接对⽬标⽅法进⾏调⽤,⽽是通过代理类间接调⽤&#xff0c;在某些情况下,⼀个对象不适合或者不能直接引⽤另⼀个对…

51单片机蜂鸣器

蜂鸣器 蜂鸣器的工作原理 三极管的工作原理 三极管是一种半导体器件&#xff0c;通常由三个掺杂不同的半导体材料层构成。它常用于放大和开关电路中。三极管的工作原理可简述如下&#xff1a; 放大作用&#xff1a;三极管可以放大电流和电压信号。它的工作原理基于控制一个较大…

利用OpenGL图形库实现人物动画移动效果

使用OpenGL库实现人物动画移动效果需要涉及到更复杂的图形编程和事件处理。以下是一个简单的例子&#xff0c;使用OpenGL和GLUT库实现人物的基本动画移动效果。 确保你已经安装了OpenGL和GLUT。你可以使用包管理器或者从官方网站下载并安装。 一、如果你已经安装过了OpenGL和…

Web前端与低代码可以碰出什么火花?

技术快速迭代&#xff0c;Web前端开发已经逐渐成为构建现代应用程序的关键组成部分。它不仅涉及到美观的界面设计&#xff0c;还包括后端功能的实现&#xff0c;以及跨平台兼容性的考虑。然而&#xff0c;传统的Web前端开发过程往往需要进行长时间的编码和调试&#xff0c;这使…