LeetCode 打卡day54-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.hqwc.cn/news/8009.html

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

相关文章

uni-app 微信小程序发布时,主包超过2M限制

小程序发布时&#xff0c;提示超过2M&#xff0c;无法通过&#xff0c;此时可以尝试以下几种方法&#xff1a; 1、对图片做压缩 图片尽量放在服务器端&#xff0c;使用的时候&#xff0c;通过URL路径获取&#xff0c;若不得已放在本地时&#xff0c;可以对图片进行压缩&#…

InsCode Stable Diffusion 美图活动投稿

本地部署可以使用B站大佬秋叶的整合包 CSDN亦提供了Stable Diffusion 模型在线使用地址&#xff1a;https://inscode.csdn.net/inscode/Stable-Diffusion 模型相关版本和参数配置&#xff1a; 模型&#xff1a;cetusversion4.WRgK.safetensors [b42b09ff12] VAE&#xff1a;y…

MySQL - 第14节 - MySQL使用C语言连接

1.引入库 要使用C语言连接MySQL&#xff0c;需要使用MySQL官网提供的库。 1.1.下载库文件 下载库文件&#xff1a; 首先&#xff0c;进入MySQL官网&#xff0c;选择DEVELOPER ZONE&#xff08;开发人员专区&#xff09;&#xff0c;然后点击MySQL Downloads。如下&#xff1a; …

黑马头条-day02

文章目录 前言一、文章列表加载1.1 需求分析1.2 表结构分析1.3 导入文章数据库1.4 实现思路1.5 接口定义1.6 功能实现 二、freemarker2.1 freemarker简介2.2 环境搭建&&快速入门2.2.1 创建测试工程 2.3 freemarker基础2.3.1 基础语法种类2.3.2 集合指令2.3.3 if指令2.3…

3.Hive SQL数据定义语言(DDL)

1. 数据定义语言概述 1.1 常见的开发方式 &#xff08;1&#xff09; Hive CLI、Beeline CLI Hive自带的命令行客户端 优点&#xff1a;不需要额外安装 缺点&#xff1a;编写SQL环境恶劣&#xff0c;无有效提示&#xff0c;无语法高亮&#xff0c;误操作率高 &#xff08;2&…

UE5《Electric Dreams》项目PCG技术解析 之 PCGDemo_Ditch关卡详解

文章目录 前导文章关卡概要PCGGraphPoints From Actor Tag作为PCG的分割工具分层装饰 一些知识点和技巧使用Attribute Operation将属性暂存到临时属性中是否生成碰撞 小结 前导文章 《UE5《Electric Dreams》项目PCG技术解析 之 基于关卡PCGSettings的工作流》《UE5《Electric…

项目性能优化-内存泄漏检测与修改

最近终于有空优化一波项目的性能了&#xff0c;第一波借助Android Studio自带的Profiler工具检测内存泄漏。 第一步、创建Profiler的SESSIONS 第二步、进入MEMORY内存监控 右侧带有绿色原点的就是此时运行的Profiler的SESSION,点击右侧MEMORY进入内存监控的详情模块 第三步…

靶场DVWA未授权访问导致的RCE

1漏洞地址&#xff1a; http://xxxx.vom/vulnerabilities/exec/source/low.php 2漏洞原因&#xff1a; 命令执行直接拼接 3漏洞验证 linux写入phpinfo(); 到hackable/uploads/目录&#xff08;也可以直接写在当前目录&#xff09; 明文内容&#xff1a; 1&echo “<…

Java-数据结构(三)-List:ArrayList和LinkedList及其相关面试题

目录 一、引言二、ArrayList2.1 ArrayList是什么&#xff1f;2.2 ArrayList的历史由来2.3 ArrayList的使用好处2.4 ArrayList的底层原理2.5 ArrayList的操作方法及代码示例 三、LinkedList3.1 LinkedList是什么&#xff1f;3.2 LinkedList的历史由来3.3 LinkedList的使用好处3.…

MySQL事务相关笔记

杂项 InnoDB最大特点&#xff1a;支持事务和行锁&#xff1b; MyISAM不支持事务 介绍 一个事务是由一条或者多条对数据库操作的SQL语句所组成的一个不可分割的单元&#xff0c;只有当事务中的所有操作都正常执行完了&#xff0c;整个事务才会被提交给数据库。事务有如下特性…

大数据面试题-场景题

1.手写Flink的UV 手写Flink的UV 2.Flink的分组TopN Flink的分组TopN 3.Spark的分组TopN 1&#xff09;方法1&#xff1a; &#xff08;1&#xff09;按照key对数据进行聚合&#xff08;groupByKey&#xff09; &#xff08;2&#xff09;将value转换为数组&#xff0c;利…

银河麒麟服务器v10 sp1 安装mysql

可以先用 dpkg --list|grep mysql 查看自己的mysql有哪些依赖&#xff1a; 上图已经是安装后的截图&#xff0c;然后再卸载 sudo apt-get autoremove --purge mysql-common 本文在没有安装之前&#xff0c;只有mysql-common包&#xff0c;再用dpkg --list|grep mysql查看&…