代码随想录算法训练营day56 | 583. 两个字符串的删除操作,72. 编辑距离,编辑距离总结篇

news2024/11/25 8:15:43

代码随想录算法训练营day56 | 583. 两个字符串的删除操作,72. 编辑距离,编辑距离总结篇

  • 583. 两个字符串的删除操作
    • 解法一:动态规划
    • 解法二:计算最长公共子序列,然后用数组长度减掉子序列长度
  • 72. 编辑距离
    • 解法一:动态规划
  • 编辑距离总结篇


583. 两个字符串的删除操作

教程视频:https://www.bilibili.com/video/BV1we4y157wB
在这里插入图片描述

解法一:动态规划

思路:
1、dp[i][j]定义:以索引i-1结尾的word1和以j-1结尾的word2相同所需要的最小步数
2、递推公式:

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-1][j], dp[i][j-1])+1;
 }

3、初始化dp:索引包含0表示空串,dp[i][0]=i; dp[0][j]=j;
4、 遍历顺序:两层for均正向遍历
5、打印验证

class Solution {
    public int minDistance(String word1, String word2) {
        // 1. dp[i][j]定义:以索引i-1结尾的word1和以j-1结尾的word2相同所需要的最小步数
        int[][] dp = new int[word1.length()+1][word2.length()+1];

        // 3. 初始化dp:索引包含0表示空串,dp[i][0]=i; dp[0][j]=j;
        for(int i=1;i<=word1.length();i++){
            dp[i][0]=i;
        }
        for(int j=1;j<=word2.length();j++){
            dp[0][j]=j;
        }

        // 4. 遍历顺序:两层for均正向遍历
        for(int i=1;i<=word1.length();i++){
            for(int j=1;j<=word2.length();j++){
                // 2. 递推公式:
                if(word1.charAt(i-1)==word2.charAt(j-1)){
                    dp[i][j]=dp[i-1][j-1];
                }else{
                	// 这里简化了dp[i-1][j-1]+2
                    dp[i][j]=Math.min(dp[i-1][j], dp[i][j-1])+1;
                }
            }
        }
        // 5. 打印验证
        return dp[word1.length()][word2.length()];    
    }
}

解法二:计算最长公共子序列,然后用数组长度减掉子序列长度

结果为word1.length()+word2.length()-2*childLength

最长公共子序列代码见:https://editor.csdn.net/md/?articleId=130897102

72. 编辑距离

教程视频:https://www.bilibili.com/video/BV1qv4y1q78f
在这里插入图片描述
在这里插入图片描述

解法一:动态规划

思路:
1、dp[i][j]定义:以索引i-1结尾的word1和以j-1结尾的word2相同所需要的最少操作次数
2、递推公式:

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-1][j-1]+1, Math.min(dp[i-1][j]+1, dp[i][j-1]+1));
 }

3、初始化dp:索引包含0表示空串,dp[i][0]=i; dp[0][j]=j;
4、 遍历顺序:两层for均正向遍历
5、打印验证

class Solution {
    public int minDistance(String word1, String word2) {
        int[][] dp =new int[word1.length()+1][word2.length()+1];
        for(int i=1;i<=word1.length();i++){
            dp[i][0]=i;
        }
        for(int j=1;j<=word2.length();j++){
            dp[0][j]=j;
        }

        for(int i=1;i<=word1.length();i++){
            for(int j=1;j<=word2.length();j++){
                if(word1.charAt(i-1)==word2.charAt(j-1)){
                    dp[i][j]=dp[i-1][j-1];
                }else{
                	// 替换操作dp[i-1][j-1]+1
                	// 增加和删除互为逆向操作,逻辑一样,金考虑删除即可Math.min(dp[i-1][j]+1, dp[i][j-1]+1)
                    dp[i][j]= Math.min(dp[i-1][j-1]+1, Math.min(dp[i-1][j]+1, dp[i][j-1]+1));
                }
            }
        }
        return dp[word1.length()][word2.length()];
    }
}

编辑距离总结篇

教程:动态规划之编辑距离总结篇
结合我的笔记:
代码随想录算法训练营day52 | 300.最长递增子序列,674. 最长连续递增序列,718. 最长重复子数组
代码随想录算法训练营day53 | 1143.最长公共子序列,1035.不相交的线,53. 最大子序和 动态规划
代码随想录算法训练营day55 | 392.判断子序列,115.不同的子序列

  1. 判断子序列只需要计算删除的情况,不用考虑增加和替换的情况,递推公式为:
if (s[i - 1] == t[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1;
else dp[i][j] = dp[i][j - 1];

  1. 不同的子序列虽然也只有删除操作,不用考虑替换增加之类的,但可以重复匹配,递推公式变为:
if (s[i - 1] == t[j - 1]) {
    dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];
} else {
    dp[i][j] = dp[i - 1][j];
}
  1. 两个字符串的删除操作。
    当word1[i - 1] 与 word2[j - 1]相同的时候,dp[i][j] = dp[i - 1][j - 1];
    当word1[i - 1] 与 word2[j - 1]不相同的时候,dp[i][j] = min({dp[i - 1][j - 1] + 2, dp[i - 1][j] + 1, dp[i][j - 1] + 1});
if (word1[i - 1] == word2[j - 1]) {
    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));
}

  1. 编辑距离
    在这里插入图片描述
    word2添加一个元素,相当于word1删除一个元素,由此可见增加和删除互为逆向操作,word2添加一个元素d,也就是相当于word1删除一个元素d,操作数是一样!所以递推公式为:
if (word1[i - 1] == word2[j - 1]) {
    dp[i][j] = dp[i - 1][j - 1];
}else {
    dp[i][j] = Math.min({dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1]}) + 1;
}


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

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

相关文章

界面组件DevExpress ASP.NET Core v22.2 - UI组件升级

DevExpress ASP.NET Core Controls使用强大的混合方法&#xff0c;结合现代企业Web开发工具所期望的所有功能。该套件通过ASP.NET Razor标记和服务器端ASP.NET Core Web API的生产力和简便性&#xff0c;提供客户端JavaScript的性能和灵活性。ThemeBuilder工具和集成的Material…

【操作系统】01.操作系统概论

操作系统的发展历史 未配置操作系统 手工操作阶段 用户独占全机&#xff0c;人机速度矛盾导致系统资源利用率低 脱机输入输出方式 为了缓解主机cpu和IO设备之间速度不匹配的矛盾&#xff0c;出现了脱机IO技术 在外围机的控制下&#xff0c;通过输入设备&#xff0c;将数据输…

Spring事务和事务的传播机制

一、为什么需要事务 1.1事务定义 将一组操作封装成一个执行单元&#xff0c;要么全部成功要么全部失败。 1.2为什么要用事物 例如转账分为两个操作&#xff1a; 第⼀步操作&#xff1a;A 账户 -100 元。第⼆步操作&#xff1a;B 账户 100 元。 如果没有事务&#xff0c;第…

脱岗监测预警系统 yolov5

脱岗监测预警系统可以通过pythonyolov5网络模型深度学习算法&#xff0c;脱岗监测预警算法对现场人员岗位进行实时监测&#xff0c;自动识别是否存在脱岗行为&#xff0c;并及时发出警报。Yolo意思是You Only Look Once&#xff0c;它并没有真正的去掉候选区域&#xff0c;而是…

2023安卓逆向 -- 抓包环境设置(Charles+Postern)

一、下载Charles并设置代理 1、下载地址&#xff0c;一路下一步即可安装 https://www.charlesproxy.com/ 2、代理设置&#xff0c;抓取所有ip及所有端口的数据包&#xff0c;点击Proxy&#xff0c;选择SSL Proxying Settings 3、点击Add&#xff0c;Host和Port都填写*&#x…

chatgpt赋能python:Python中的升序降序sort解析

Python中的升序降序sort解析 在 Python 开发中&#xff0c;sort 方法是非常常用的方法&#xff0c;它可以对包含数字或字符串的列表进行排序&#xff0c;其中有两种排序方式&#xff0c;分别是升序和降序。本篇文章将会深入探讨 Python 中的 sort 方法&#xff0c;着重介绍升序…

【回顾经典AI神作】卷积神经网络CNN架构系列:LeNet,AlexNet,VGG,GoogLeNet,ResNet

卷积神经网络(CNN或ConvNet)是一种特殊的多层神经网络,旨在以最少的预处理直接从像素图像中识别视觉模式。ImageNet项目是一个大型视觉数据库,设计用于视觉对象识别软件研究。ImageNet 项目举办年度软件竞赛,即 ImageNet 大规模视觉识别挑战赛 (ILSVRC),软件程序竞相正…

企业客户管理难题都有哪些?CRM系统如何解决?

CRM系统在客户管理中的重要性不言而喻&#xff0c;它可以帮助企业提高销售效率&#xff0c;优化客户体验和忠诚度&#xff0c;增加市场份额和利润。那么&#xff0c;CRM客户管理系统如何解决大客户管理难题? 企业大客户管理难题都有哪些&#xff1a; 1、需求十分多变 大客户…

第二节 Python分支结构

文章目录 一&#xff0c;分支结构1.1 概述1.2 语法格式1.2.1 单分支语法结构1.2.2 多分支语法结构1.2.3 多重语法结构1.2.4 分支语句的嵌套结构 1.3 Debug调试1.4 三元运算符1.4.1 求两个数的差值 二 专项练习题2.1 计算快递包裹重量2.2 判断奇偶数2.3 判断闰年2.4 最大的数2.5…

Win11怎么远程控制另外一台电脑?

​Win11是微软推出的一款Windows操作系统&#xff0c;它改善了视觉效果&#xff0c;并具有许多创新功能&#xff0c;例如集成的Android应用程序&#xff0c;用于游戏的Xbox技术等。如今&#xff0c;许多用户已从Win10或Win7升级到Win11。但是很多用户不知道Win11怎么远程控制另…

ArcGis系列-java发布空间表为要素服务(feature)

1,实现思路 使用java调用cmd命令执行python脚本python环境使用arcgis pro安装目录下的 \ArcGIS\Pro\bin\Python\envs\arcgispro-py3发布数据库表前需要先用创建数据库的sde文件&#xff08;创建sde文件不需要连接arcgis&#xff09;发布表时,先在本地的空项目模板中添加数据库…

界面组件Telerik UI for WPF可轻松实现直方图,让数据可视化更简单

Telerik UI for WPF拥有超过100个控件来创建美观、高性能的桌面应用程序&#xff0c;同时还能快速构建企业级办公WPF应用程序。UI for WPF支持MVVM、触摸等&#xff0c;创建的应用程序可靠且结构良好&#xff0c;非常容易维护&#xff0c;其直观的API将无缝地集成Visual Studio…

word如何设置页码?教您快速掌握!

案例&#xff1a;论文排版时&#xff0c;需要对页码进行编号&#xff0c;但我不知道怎么操作。我想如何快速设置word页码&#xff0c;有没有小伙伴可以分享一下方法&#xff1f; word是一款广泛使用的文字处理软件&#xff0c;许多人在撰写论文、报告或其他文档时都需要对页面…

StableDiffusion教程(3) - 模型安装

StableDiffusion模型安装 1. 搜索模型 打开C站或者LibLibAI模型站下载模型 C站地址&#xff1a;https://civitai.com/ LibLibAI模型站地址&#xff1a;LiblibAi - 中国领先原创AI模型分享社区 2. 下载模型 在模型详情页面&#xff0c;点击下载即可下载模型 3. 把模型放进S…

《A New General Type-2 Fuzzy Predictive Scheme for PID Tuning》翻译,2021年

《一种新的用于PID整定的通用2型模糊预测方案》 摘要 PID控制器在各种工业应用中被广泛使用。但是&#xff0c;在许多有噪音的问题中&#xff0c;需要强有力的方法来优化PID参数。在本文中&#xff0c;介绍了一种通过模型预测控制和广义 2 型模糊逻辑系统调整比例-积分-微分参数…

一步一步的指导在自定义数据集上训练 YOLO NAS

本教程将一步一步指导实验 YOLO-NAS 的进行完整的数据集训练。 YOLO-NAS是目前最新的YOLO物体检测模型。从一开始,它就在准确性方面击败了所有其他 YOLO 模型。与之前的 YOLO 模型相比,经过预训练的 YOLO-NAS 模型可以更准确地检测到更多的对象。但是我们如何在自定义数据集…

MySQL 条件判断函数

文章目录 条件判断函数if()函数ifnull() 函数case() 函数1. 成功匹配其中一条 when 分支3. 所有 when 分支匹配失败&#xff0c;进入 else 默认分支。 条件判断函数 关于条件判断函数&#xff0c;主要介绍以下三种&#xff1a; if()函数 if() 函数&#xff0c;其基本语法如下…

D4-4 基本分页存储管理方式(第二节课)

目录 4.4.4 两级和多级页表 1、两级页表的引入 2、两级页表 4.4.6 对换 1、外存的划分 2、对换区管理 3、进程的换出与换入 4.4.4 两级和多级页表 1、两级页表的引入 可以采用以下方法来解决这一问题&#xff1a; 采用离散分配方式来解决难以找到一块连续的大内存空…

SaaS突围战,用友走了8年,金蝶却用了10年,成果却被捷足先登

“南金蝶北用友”得风口在哪里&#xff1f; 众所周知&#xff0c;在企业软件管理市场中&#xff0c;一直有着这样的说法“北用友南金蝶”&#xff0c;足以可见&#xff0c;两家企业在市场中的份量。两家公司最初都是以财务软件起家&#xff0c;关于创始人王文京和徐少春的创业…

PyTorch-模型验证

目的&#xff1a;利用已经训练好的网络模型&#xff0c;输入数据进行测试。&#xff08;相当于将其运用于真实场景中&#xff09; Cifar-10分类&#xff1a; test1&#xff1a;放入一张狗狗的图片 进行验证&#xff1a;test.py import torch import torchvision from PIL imp…