LeetCode 打卡day54-55 动态规划之编辑距离问题

news2024/11/25 7:54:55

一个人的朝圣 — LeetCode打卡第54-55天

  • 知识总结
  • Leetcode 392. 判断子序列
    • 题目说明
    • 代码说明
  • Leetcode 115. 不同的子序列
    • 题目说明
    • 代码说明
  • Leetcode 583. 两个字符串的删除操作
    • 题目说明
    • 代码说明
  • Leetcode 72. 编辑距离
    • 题目说明
    • 代码说明


知识总结

今天学习动态规划里面的编辑距离问题, 有几道类似的题目, 可以使用相同的模板来做


Leetcode 392. 判断子序列

题目链接

题目说明

给定字符串 s 和 t ,判断 s 是否为 t 的子序列。

字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。

进阶:

如果有大量输入的 S,称作 S1, S2, … , Sk 其中 k >= 10亿,你需要依次检查它们是否为 T 的子序列。在这种情况下,你会怎样改变代码?

在这里插入图片描述

代码说明

方法1 , 使用双指针可以比较快的做出了, 相等的话两个指针都往前进, 不相等就只走t的指针

class Solution {
    public boolean isSubsequence(String s, String t) {
        int index = 0;
        int len1 = s.length(), len2 = t.length();
        if(len1 == 0) return true;
        if(len2 == 0) return false;
        for(int i = 0; i < t.length(); i++){
            if(s.charAt(index) == t.charAt(i)){
                index++;
                if(index == s.length()){
                    return true;
                }
            }
        }
        return false;
    }
}

方法2, 当然我们还是要学会用动态规划的思想来解决该系列问题
这个问题可以转换成找s, t的最大公共序列的长度, 如果该长度=s.长度, 则t包含了s.

class Solution {
    public boolean isSubsequence(String s, String t) {
        int len1 = s.length(), len2 = t.length();
        // dp[i][j] 代表着以i-1结尾的s和j-1结尾的t的最大公共子序列长度
        int[][] dp = new int[len1+1][len2+1];
        for(int i = 1; i <= len1; i++){
            for(int j = 1; j <=len2; j++){
                if(s.charAt(i-1) == t.charAt(j-1)){
                    dp[i][j] = dp[i-1][j-1] + 1;
                }else{
                    dp[i][j] = dp[i][j-1];
                }
            }
            // System.out.println(Arrays.toString(dp[i]));
        }
        return dp[len1][len2] == len1;
   
    }
}

Leetcode 115. 不同的子序列

题目链接

题目说明

给你两个字符串 s 和 t ,统计并返回在 s 的 子序列 中 t 出现的个数。

题目数据保证答案符合 32 位带符号整数范围。

在这里插入图片描述

代码说明

这个题目还挺难的,第一次做的话可能没有思路。
难点在于递推公式如何求出来:

  1. dp数组 // dp[i][j] 表示以i-1 结尾的s字符串中包含多少个以j-1结尾的t字符串
  2. 递推公式

if(s.charAt(i-1) == t.charAt(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]; // 不相等的话只能依靠前面的
}
设置i-1, j-1 是为了初始化的时候更加方便。

class Solution {
    public int numDistinct(String s, String t) {
        int len1 = s.length(), len2 = t.length();
        int[][] dp = new int[len1+1][len2+1];
        // dp[i][j] 表示以i-1 结尾的s字符串中包含多少个以j-1结尾的t字符串


        for(int i = 0; i<=len1; i++){
            dp[i][0] = 1; 
        }

        for(int i = 1; i <= len1; i++){
            for(int j = 1; j <= len2; j++){
                if(s.charAt(i-1) == t.charAt(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];
                }
            }
            // System.out.println(Arrays.toString(dp[i]));
        }

        return dp[len1][len2];
    }
}

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

题目链接

题目说明

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

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

代码说明

dp数组含义
dp[i][j]:以i-1为结尾的字符串word1,和以j-1位结尾的字符串word2,想要达到相等,所需要删除元素的最少次数。
递推公式
当word1[i - 1] 与 word2[j - 1]相同的时候
当word1[i - 1] 与 word2[j - 1]不相同的时候

情况一:删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, 情况三的结果会等于情况1

这题难在初始化时, dp[i][0] = i 而不是1
如果相等, 说明不需要删除, dp[i][j] = dp[i-1][j-1], 如果不相等, 则取小的最小删除数再加1.

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

        for(int i = 0; i <= len1; i++) dp[i][0] = i;
        for(int j = 0; j <= len2; j++) dp[0][j] = j;
        for(int i = 1; i <= len1; i++){
            for(int j = 1; j <= len2; j++){
                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][j-1], dp[i-1][j]) + 1;
                }
            }
            // System.out.println(Arrays.toString(dp[i]));
        }
        return dp[len1][len2];
    }
}

Leetcode 72. 编辑距离

题目链接

题目说明

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

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

插入一个字符
删除一个字符
替换一个字符

在这里插入图片描述

代码说明

将上面那题弄懂之后, 难题也变简单了, 就是增加了一个表达式的
dp[i][j] = Math.min(dp[i][j-1], Math.min(dp[i-1][j], dp[i-1][j-1])) + 1;
以前需要删除两下的操作, 我可以通过替换一步就可以做出来。

情况三由:同时删word1[i - 1]和word2[j - 1],操作的最少次数为dp[i - 1][j - 1] + 2
变成了dp[i-1][j-1] + 1 的替换操作

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

        for(int i = 0; i <= len1; i++) dp[i][0] = i;
        for(int j = 0; j <= len2; j++) dp[0][j] = j;
        for(int i = 1; i <= len1; i++){
            for(int j = 1; j <= len2; j++){
                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][j-1], Math.min(dp[i-1][j], dp[i-1][j-1])) + 1; 
                }
            }
            // System.out.println(Arrays.toString(dp[i]));
        }
        return dp[len1][len2];
    }
}

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

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

相关文章

《零基础学PIC单片机》目录

《零基础学PIC单片机》目录 1.《零基础学PIC单片机》&#xff0c;作者&#xff1a;赵化启 1.1芯片架构和指令 芯片架构和指令需要较多时间消化。 PIC单片机系统结构&#xff0c;讲解各模块的结构和功能&#xff1b;PIC汇编指令 1.2具有参考价值的内容 第3章&#xff1a;电…

批发零售行业应该如何选择进销存软件?

一、什么是进销存软件 进&#xff1a;需要将产品采购入库&#xff0c;自动生成采购明细台账同时关联财务生成付款账单&#xff1b; 销&#xff1a;是指对客户的销售订单记录&#xff0c;汇总生成产品销售明细及回款计划&#xff1b; 存&#xff1a;库存的日常盘点与统计&…

看一眼Mysql查询语句

目录 &#x1f6fb; 查询数据 &#x1f6fb;基本查询语句 &#x1f6fb;单表查询 &#x1f695;查询所有字段 &#x1f695;查询指定字段 &#x1f695;查询指定记录 &#x1f695;带in关键字的查询 &#x1f695;带between and的范围查询 &#x1f695;带like的字符匹…

一文带你了解socket网络编程以及详解过程和原理

创作不易&#xff0c;期望亲友们给个免费的就行 文章目录 一、什么是socket二、TCP/IP三、socket原理四、代码说明五、API函数 一、什么是socket Socket&#xff08;套接字&#xff09;是计算机网络编程中的一种抽象概念&#xff0c;它提供了在网络上进行通信的接口。通过使用…

RankNet(pairwise)

原论文&#xff1a;From ranknet to lambdarank to lambdamart: An overview 构造样本&损失函数 首先对同一个query下返回的连接&#xff0c;进行配对构造样本<Ui, Uj>代表了一对样本。用Pij代表样本的得分&#xff0c;si,sj代表了模型对样本的打分。 有了样本模型…

处理 Windows Server 中 CVE-2016-2183(SSL/TLS) 漏洞的方法

一、漏洞说明 Windows server 2008或2012远程桌面服务SSL加密默认是开启的&#xff0c;且有默认的CA证书。由于SSL/ TLS自身存在漏洞缺陷&#xff0c;当开启远程桌面服务&#xff0c;使用漏洞扫描工具扫描&#xff0c;发现存在SSL/TSL漏洞。 例如如下漏洞&#xff1a; 二、…

(02)Cartographer源码无死角解析-(75) 2D后端优化→整体复盘,理解后端优化核心思想

讲解关于slam一系列文章汇总链接:史上最全slam从零开始&#xff0c;针对于本栏目讲解(02)Cartographer源码无死角解析-链接如下: (02)Cartographer源码无死角解析- (00)目录_最新无死角讲解&#xff1a;https://blog.csdn.net/weixin_43013761/article/details/127350885 文…

跨境干货|Etsy安全入驻开店攻略

2023了&#xff0c;跨境电商现在上车还来得及吗&#xff1f;当然&#xff01;Etsy是一个低成本低竞争高回报的平台&#xff0c;相较于其他电商平台&#xff0c;他的佣金非常低&#xff0c;利润率更高&#xff0c;非常合适跨境小白入局。 但由于目前Etsy关闭了中国大陆卖家的注…

设计模式- 一、设计原则-1

一、设计原则 当涉及到软件设计和开发原则时&#xff0c;有一些常见的原则和准则可以帮助我们编写高质量、可维护和可扩展的代码。以下是其中一些重要的原则和准则&#xff1a; SOLID原则&#xff1a; 单一职责原则&#xff08;Single Responsibility Principle&#xff0c;SRP…

SpringMVC快速学习

一、SSM框架优化的方向 目录结构&#xff1a; 二、前期文件配置 pom.xml <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 ht…

USB转串口电路—电源与防倒灌设计

USB转串口芯片和串口负载&#xff08;MCU、CPU、其他串口外设等&#xff09;的供电方式可以分为2个大类&#xff1a;统一供电和独立供电。 一、供电说明 统一供电是指USB芯片和串口负载使用同一电源&#xff0c;上下电同步&#xff0c;此时不会存在彼此之间电流倒灌的问题。 …

ORA-01122 ORA-01200故障处理---惜分飞

由于某种原因客户的数据库启动报ORA-01122 ORA-01200错误 让客户把system01.dbf文件发给我进行分析,发现system01.dbf文件大于32G(在8k的blocksize库中,默认情况system01.dbf文件不会超过32G),这个明显异常 检测坏块情况发现4096000之后的block全部为全0块 通过bbed分析文…

数学建模常用模型(二):插值与拟合

数学建模常用模型&#xff08;二&#xff09;&#xff1a;插值与拟合 在数学建模中&#xff0c;插值和拟合是常用的数据分析技术&#xff0c;用于从给定的离散数据中推断出连续函数或曲线的近似形式。 插值是通过已知数据点之间的插值多项式来估计未知数据点的值。插值方法的目…

SQL之收集SQL Server线程等待信息

要知道线程等待时间是制约SQL Server效率的重要原因&#xff0c;这一个随笔中将学习怎样收集SQL Server中的线程等待时间&#xff0c;类型等信息&#xff0c;这些信息是进行数据库优化的依据。 sys.dm_os_wait_stats 这是一个系统视图&#xff0c;里面存储线程所遇到的所有的等…

smart Spring:自定义注解、拦截器的使用(更新中...)

文章目录 〇、使用自定义注解的好处和工作原理一、如何使用自定义注解1.自定义一个注解2.在类、属性、方法上进行使用3.元注解 二、使用拦截器的好处和工作原理三、如何使用拦截器参考 本博客源码&#xff1a; 〇、使用自定义注解的好处和工作原理 自定义注解是Java语言提供的…

消息中间件应用场景

提高系统性能首先考虑的是数据库的优化&#xff0c;但是数据库因为历史原因&#xff0c;横向扩展是一件非常复杂的工程&#xff0c;所有我们一般会尽量把流量都挡在数据库之前。 不管是无限的横向扩展服务器&#xff0c;还是纵向阻隔到达数据库的流量&#xff0c;都是这个思路。…

JSP网上手机商城系统 用eclipse定制开发mysql数据库BS模式java编程jdbc

一、源码特点 JSP 网上手机商城系统是一套完善的web设计系统&#xff0c;对理解JSP java SERLVET mvc编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,eclipse开发&#xff0c;数据库为Mysql5.0&a…

Camera API1 简叙述

目录 一、开启相机 1.1创建项目 1.2注册权限 1.3配置相机特性要求 1.4 获取摄像头的个数 1.5 根据 ID 获取 CameraInfo facing 1.6 开启相机 1.7 关闭相机 二、预览 2.1认识 Parameters 2.2 设置预览尺寸 2.3添加预览 Surface 2.4 开启和关闭预览 2.5 校正预览画…

【电路原理学习笔记】第2章:电压、电流和电阻:2.3 电压

第2章&#xff1a;电压、电流和电阻 2.3 电压 正电荷和负电荷之间存在着吸引力&#xff0c;必须以做功的形式施加一定的能量来克服吸引力&#xff0c;才能使正、负电荷分开一定的距离。所以极性相反的电荷由于它们之间的距离而具有一定的势能。电荷之间的势能之差就称为电位差…

一、枚举类型——新特性(switch 中的 case null)

JDK 17新増了&#xff08;预览&#xff09;功能&#xff0c;可以在 switch 中引入原本非法的 case null。以前只能在 switch 的外部检查是否为 null&#xff0c;如 old() 中所示&#xff1a; CaseNull.java import java.util.function.Consumer;public class CaseNull {static …