day50【代码随想录】动态规划之不同的子序列、两个字符串的删除操作、编辑距离

news2024/11/30 20:29:52

文章目录

  • 前言
  • 一、不同的子序列(力扣115)【hard】
  • 二、两个字符串的删除操作(力扣583)
    • 思路一
    • 思路二
  • 三、编辑距离(力扣72)【hard】


前言

1、不同的子序列
2、两个字符串的删除操作
3、编辑距离


一、不同的子序列(力扣115)【hard】

给定一个字符串 s 和一个字符串 t ,计算在 s 的子序列中 t 出现的个数。

字符串的一个 子序列 是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。(例如,“ACE” 是 “ABCDE” 的一个子序列,而 “AEC” 不是)
在这里插入图片描述
分析:
求有多少种删除元素的方式,使s变成t
1、dp数组以及下标含义
dp[i][j]:以i-1为结尾的s中有以j-1为结尾的t的个数为dp[i][j]
2、递推公式

s[i-1] == t[j-1] dp[i][j] = dp[i-1]j-1 + dp[i-1][j](不使用s[i-1]这个元素 使用s[i-1]之前的元素)

那么如果不相等的话 else dp[i][j] = dp[i-1][j] 也就是不使用s[i-1]这个元素
3、初始化
根据递推公式
dp[i][0] —> s[i-1] t[-1] -1相当于是空字符串,t是空字符号串 s不是空的,s中的元素全部删除之后我们的s就变成了空字符串,因此只有这一种方法使s变成t。dp[i][0] = 1;

dp[0][j] —> s[-1] t[j-1] s是空字符串 t不是空的,没有任何一种方法可以使s变成t,因此dp[0][j] =0;

这两个中间有一个交集 dp[0][0] —> s是空字符串 t是空字符串 有一种方法可以让s变成t。因此dp[0][0] = 1;

4、遍历顺序
从前往后 两个字符串顺序不能颠倒
5、举例推导dp数组
以s:“baegg”,t:"bag"为例,推导dp数组状态如下:

在这里插入图片描述

class Solution {
    public int numDistinct(String s, String t) {
        char[] ss = s.toCharArray();
        char[] tt = t.toCharArray();

        int[][] dp = new int[ss.length+1][tt.length+1];
        for(int i=0;i<=ss.length;i++){
            dp[i][0] = 1;
        } 
        for(int i=1;i<=ss.length;i++){
            for(int j=1;j<=tt.length;j++){
                if(ss[i-1]==tt[j-1])
                    dp[i][j] = dp[i-1][j-1]+dp[i-1][j];
                else
                    dp[i][j] = dp[i-1][j];
            }
        }
        return dp[ss.length][tt.length];
    }
}

在这里插入图片描述

二、两个字符串的删除操作(力扣583)

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

每步 可以删除任意一个字符串中的一个字符。
在这里插入图片描述

思路一

分析:
本题和.不同的子序列相比,其实就是两个字符串都可以删除了,情况虽说复杂一些,但整体思路是不变的。
1、dp数组以及下标含义
dp[i][j]:以i-1为结尾的word1中有以j-1为结尾的word2想要达到相等,所需要删除元素的最少次数。
2、递推公式
if(word1[i-1] == word2[j-1]) dp[i][j] = dp[i-1][j-1]

else dp[i][j] = min(dp[i][j-1]+1, dp[i-1][j]+1)

3、初始化
for(int i=0;i<word1.length();i++) dp[i][0] = i
for(int j=0;j<word2.length();i++) dp[0][j] = j

4、遍历顺序
从左到右 从上到下
5、举例推导dp数组
以word1:“sea”,word2:"eat"为例,推导dp数组状态图如下:
在这里插入图片描述

class Solution {
    public int minDistance(String word1, String word2) {
       int[][] dp = new int[word1.length()+1][word2.length()+1];

       //初始化
       for(int i=0;i<=word1.length();i++){
           dp[i][0] = i;
       }
       for(int j=0;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][j] = Math.min(Math.min(dp[i-1][j]+1,dp[i][j-1]+1),dp[i-1][j-1]+2);
           }
       }
       return dp[word1.length()][word2.length()];
    }
}

在这里插入图片描述

思路二

本题和最长公共子序列基本相同,只要求出两个字符串的最长公共子序列长度即可,那么除了最长公共子序列之外的字符都是必须删除的,最后用两个字符串的总长度减去两个最长公共子序列的长度就是删除的最少步数。

class Solution {
    public int minDistance(String word1, String word2) {
        char[] word11 = word1.toCharArray();
        char[] word22 = word2.toCharArray();

        int[][] dp = new int[word11.length+1][word22.length+1];

        int res = 0;

        for(int i=1;i<=word11.length;i++){
            for(int j=1;j<=word22.length;j++){
                if(word11[i-1] == word22[j-1]){
                    dp[i][j] = dp[i-1][j-1]+1;
                }
                else{
                    dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);
                }
                res = Math.max(res,dp[i][j]);
            }
        }
        return word11.length+word22.length-res*2;
    }
}

return word11.length+word22.length-res2; 注意最后一定要2
在这里插入图片描述

三、编辑距离(力扣72)【hard】

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

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

插入一个字符
删除一个字符
替换一个字符
在这里插入图片描述
分析:
把word1转换为word2 而且可以进行三种操作
动态规划解决的经典题目
1、dp数组以及下标含义
dp[i][j]:以i-1为结尾的word1中有以j-1为结尾的word2想要达到相等,所需要操作元素的最少次数。
2、递推公式
if(word1[i-1] == word2[j-1]) dp[i][j] = dp[i-1][j-1]
如果不相等:

dp[i][j] = min(dp[i-1][j]+1 dp[i][j-1]+1) 删除元素 操作数+1

假设
word1: ab
word2: a
那么word1删除一个元素b和word2添加一个元素a的操作次数是一样的
逆向操作,操作次数是一样的

  • 替换

dp[i][j] = dp[i-1][j-1]+1
替换一个元素才能达到word1[i] == word2[j]

因此 dp[i][j] = min(dp[i-1][j]+1, dp[i][j-1]+1, dp[i-1][j-1]+1)

3、初始化
for(int i=0;i<word1.length();i++) dp[i][0] = i
for(int j=0;j<word2.length();i++) dp[0][j] = j

4、遍历顺序
从左到右 从上到下
5、举例推导dp数组
输入:word1 = “horse”, word2 = "ros"为例,dp矩阵状态图如下:
在这里插入图片描述

class Solution {
    public int minDistance(String word1, String word2) {
        int[][] dp = new int[word1.length()+1][word2.length()+1];

        //初始化
        for(int i=0;i<=word1.length();i++){
            dp[i][0] = i;
        }
        for(int j=0;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][j] = Math.min(Math.min(dp[i-1][j]+1, dp[i][j-1]+1),dp[i-1][j-1]+1);
                }
            }
        }
        return dp[word1.length()][word2.length()];
    }
}

在这里插入图片描述


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

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

相关文章

网页扫描图像并以pdf格式上传到服务器端

本文描述如何通过网页驱动扫描仪、高拍仪等图像扫描设备进行图像扫描&#xff0c;扫描结果经编辑修改后以pdf压缩格式上传到后台java程序中进行服务器端落盘保存。图像扫描上传如文字描述顺序所介绍&#xff0c;先要驱动扫描设备工作&#xff0c;进行纸张数据的光学扫描操作形成…

Impacket工具使用

Impacket工具说明 Impacker是用户处理网络协议的Python类集合,用于对SAB1-3或IPv4/IPv6 上的TCP/UPD/ICMP/IGMP/ARP/IPv4/IPv6/SMB/MSRPC/NTLM/Kerberos/WMI/LDAP 等进行低级的编程访问,数据包可以从头开始构建,也可以从原始数据包中解析, 面向对象API使用处理协议的深层结构变…

Action Segmentation数据集介绍——Breakfast

文章目录简介细节Cooking actibitiesillustration of the actions论文讲解Breakfast&#xff08;The Breakfast Action Dataset&#xff09;简介 早餐动作数据集包括与早餐准备相关的10个动作&#xff0c;由18个不同厨房的52个不同的人执行。该数据集是最大的完全带注释的数据…

CCIE 350-401-实验全

实验 VRRP&#xff08;hello packettimes advertise&#xff09; This is a lab item in which tasks will be performed on virtual devices. Refer to the Tasks tab to view the tasks for this lab item.Refer to the Topology tab to access the device console(s) and p…

Spring Boot自动装配的原理

Spring Boot自动装配的原理自动装配的实现EnableAutoConfigurationAutoConfigurationImportSelectorSpring Boot中的自动装配&#xff0c;它是Starter的基础&#xff0c;也是Spring Boot的核心。那么什么叫自动装配呢&#xff1f;或者说什么叫装配呢&#xff1f; 简单来说&…

Vulnhub靶场----4、DC-4

文章目录一、环境搭建二、渗透流程三、思路总结一、环境搭建 DC-4下载地址&#xff1a;https://download.vulnhub.com/dc/DC-4.zip kali&#xff1a;192.168.144.148 DC-4&#xff1a;192.168.144.152 二、渗透流程 端口扫描&#xff1a;nmap -T5 -p- -sV -sT -A 192.168.144.1…

ISIS协议

ISIS协议基础简介应用场景路由计算过程地址结构路由器分类邻居Hello报文邻居关系建立DIS及DIS与DR的类比链路状态信息的载体链路状态信息的交互路由算法网络分层路由域![在这里插入图片描述](https://img-blog.csdnimg.cn/9027c43b614a4399ae1f54e87a37f047.png)区域间路由简介…

【MySQL】表操作和库操作

文章目录概念库操作1.创建数据库2.删除数据库3.选择数据库4.显示数据库列表表操作1.创建数据表CREATE2.删除数据表DROP3.插入数据INSERT4.更新数据UPDATE5.修改数据ALTER6.查询数据SELECT7.WHERE子句8.ORDER BY子句9.LIMIT子句10.GROUP BY子句11.HAVING子句使用注意事项概念 M…

Java集合(一)---List和set

1.Java集合有哪些&#xff1f;集合类型主要有3种&#xff1a;set(集&#xff09;、list(列表&#xff09;和map(映射)Map接口和Collection接口是所有集合框架的父接口&#xff1a;1. Collection接口的子接口包括&#xff1a;Set接口和List接口2. Map接口的实现类主要有&#xf…

【Python】批量采集原神表情包~

嗨害大家好鸭~我是小熊猫(✿◡‿◡) 最近迷上了原神&#xff0c; 不自觉中就很喜欢保存广大旅行者制作的表情包~ 真的很有意思诶~ 源码资料电子书:点击此处跳转文末名片获取 一个个保存的话&#xff0c;好像效率很低嘛… 那我就发挥我小熊猫的老本行直接给把他们全部采集下…

零基础机器学习做游戏辅助第十三课--原神自动钓鱼(三)labelimg的使用

一、什么是labelimg labelimg是一款开源的图像标注工具,标签可用于分类和目标检测,它是用python写的,并使用Qt作为其图形界面,简单好用(虽然是英文版的)。其注释以 PASCAL VOC格式保存为XML文件,这是ImageNet使用的格式。此外,它还支持 COCO数据集格式。 二、安装label…

大数据时代下的企业网络安全

在大数据技术迅猛发展的今天&#xff0c;网络安全问题已经发展成一个广受关注的热门研究方向。有人说&#xff0c;“大数据下&#xff0c;人人裸奔”&#xff0c;隐私保护、数据防护日益成为广大学者、企业研究的焦点。 面对这种安全威胁&#xff0c;企业必须实施一些有效的信…

Allegro无法看到金属化孔的钻孔的原因和解决办法

Allegro无法看到金属化孔的钻孔的原因和解决办法 用Allegro设计PCB的时候,希望同时看到金属化孔的盘以及钻孔,如下图 但是有时显示效果是这样的,看不到钻孔了 导致无法直观地区分是通孔是还是表贴的盘 如何解决,具体操作如下 点击Setup

27正定矩阵

这一节进入正定矩阵的内容&#xff0c;什么叫做正定矩阵&#xff1f;为什么我们对矩阵正定这么感兴趣&#xff1f; PS&#xff1a;这一节将前面所有的概念都融合在一起&#xff1a;主元、行列式、特征值、不稳定性 一、正定矩阵的判断方法 为了说明问题&#xff0c;我们先考…

低代码平台和无代码平台哪个更适合开发企业管理系统?

编者按&#xff1a;本文分析了开发企业管理系统所需要的平台特性&#xff0c;并根据这些特点和低代码无代码的优劣比较&#xff0c;得出低代码平台更适合开发企业管理系统。关键词&#xff1a;私有化部署&#xff0c;可视化设计&#xff0c;源码交付&#xff0c;数据集成&#…

研究人员在野外发现大量的信息窃取者 “Stealc “的样本

一个名为Stealc的新信息窃取者正在暗网上做广告&#xff0c;它可能成为其他同类恶意软件的一个值得竞争的对象。 "SEKOIA在周一的一份报告中说&#xff1a;"威胁行为者将Stealc作为一个功能齐全、随时可用的窃取者&#xff0c;其开发依赖于Vidar、Raccoon、Mars和Re…

LeetCode 73. 矩阵置零

LeetCode 73. 矩阵置零 难度&#xff1a;middle\color{orange}{middle}middle 题目描述 给定一个 KaTeX parse error: Double subscript at position 3: _m_̲ x _n_ 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法…

Power Query 再谈日期表

Power Query 再谈日期表 需要附件的朋友可以点赞关注后&#xff0c;在公众号(焦棚子)后台回复 日期表 三个字即可领取。 一、背景 在 Power BI 或者 Power Pivot 做业务分析中&#xff0c;必不可少的就是日期表。我们继续优化调制出符合国人习惯日期表。 本次更新&#xff…

harbor 仓库迁移升级

harbor 仓库迁移升级 harbor仓库安装数据传输仓库切换版本 v1.8.0 v2.3.5 harbor仓库安装 环境准备&#xff1a;安装docker详见&#xff1a;docker 的介绍和部署&#xff0c;并下载docker-compose详见&#xff1a;docker 三剑客compose。 现有支持的安装harbor仓库的方式有两…

犹太教、基督教、伊斯兰教的区别与联系

一、犹太教、基督教、伊斯兰教的简明关系图二、犹太教、基督教、伊斯兰教的主要区别注&#xff1a;弥赛亚&#xff08;希伯莱语&#xff09;就是基督&#xff08;希腊语&#xff09;&#xff0c;意思是“救世主”。注&#xff1a;伊斯兰教的观点是&#xff1a;穆罕默德不是伊斯…