算法训练营第五十九天 | LeetCode 115 不同的子序列、LeetCode 583 两个字符串的删除操作、LeetCode 72 编辑距离

本文主要是介绍算法训练营第五十九天 | LeetCode 115 不同的子序列、LeetCode 583 两个字符串的删除操作、LeetCode 72 编辑距离,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

LeetCode 115 不同的子序列


这题和编辑距离比较像,也就是今天的第三题。

这题用动规解决的是多对一的分支子问题推导出当前问题的思路。

同样递推公式由两个字符串平齐,如果当前字符相等,则当前问题可由第一个字符串0~i-1和0~j-1匹配数及0~i-1和j匹配数相加所得;

如果不相等,则直接由0~i-1和j匹配得到。

初始化时,由于第二个字符串如果是0,默认已经匹配,所以dp[i][0]都要初始化为1

代码如下:

class Solution {public int numDistinct(String s, String t) {int[][] dp = new int[s.length() + 1][t.length() + 1];double mod = Math.pow(10, 9) + 7;for (int i = 0; i <= s.length(); i++) dp[i][0] = 1;for (int i = 1; i <= s.length(); i++) {for (int j = 1; j <= t.length(); j++) {if (s.charAt(i-1) == t.charAt(j-1)) dp[i][j] = dp[i-1][j-1] + dp[i-1][j];else dp[i][j] = dp[i-1][j];if (dp[i][j] > Math.pow(10, 9) + 7) dp[i][j] %= mod;}}return dp[s.length()][t.length()];}
}

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


还是可以转换为最长公共子序列问题

代码如下:

class Solution {public int minDistance(String word1, String word2) {int[][] dp = new int[word1.length() + 1][word2.length() + 1];int result = 0;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]+1;elsedp[i][j] = Math.max(dp[i][j-1], dp[i-1][j]); if (result < dp[i][j]) result = dp[i][j];}}result = word1.length() + word2.length() - result * 2;return result;}
}

LeetCode 72 编辑距离


这题其实算是用动规来暴力枚举了。dp数组下标含义其实都很好想,就是第一个字符串前i-1个字符和第二个字符串中前j-1个元素的编辑距离。

但是递推公式这一块把我给难住了。我想的是找出一种数学规律,推出递推公式。但其实可以用这么一种解法:

相等时dp[i][j]直接可以由dp[i-1][j-1]推出;

不相等时可以在第一个字符串中删除一个字符, 即dp[i-1][j]+1,

也可以在第一个字符串中插入一个字符,可以视作在第二个字符串中删除一个字符,                    即dp[i][j-1]+1, 

还可以直接替换,即dp[i-1][j-1]+1

这种思考方式其实避免了直接求最长公共子序列再进行操作时部分字符错位的情况,相当于保持了两个字符串开头平齐,从之后开始处理。

遍历顺序自然是从左到右,从上到下了。

初始化方式依照这个逻辑,把dp[i][0]都初始化为i,dp[0][j]都初始化为j就行了。

代码如下:

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];elsedp[i][j] = Math.min(dp[i-1][j],Math.min(dp[i][j-1], dp[i-1][j-1]))+1; }}return dp[word1.length()][word2.length()];}
}

这篇关于算法训练营第五十九天 | LeetCode 115 不同的子序列、LeetCode 583 两个字符串的删除操作、LeetCode 72 编辑距离的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1061892

相关文章

MySQL字符串常用函数详解

《MySQL字符串常用函数详解》本文给大家介绍MySQL字符串常用函数,本文结合实例代码给大家介绍的非常详细,对大家学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql字符串常用函数一、获取二、大小写转换三、拼接四、截取五、比较、反转、替换六、去空白、填充MySQL字符串常用函数一、

Spring的RedisTemplate的json反序列泛型丢失问题解决

《Spring的RedisTemplate的json反序列泛型丢失问题解决》本文主要介绍了SpringRedisTemplate中使用JSON序列化时泛型信息丢失的问题及其提出三种解决方案,可以根据性... 目录背景解决方案方案一方案二方案三总结背景在使用RedisTemplate操作redis时我们针对

MySQL逻辑删除与唯一索引冲突解决方案

《MySQL逻辑删除与唯一索引冲突解决方案》本文探讨MySQL逻辑删除与唯一索引冲突问题,提出四种解决方案:复合索引+时间戳、修改唯一字段、历史表、业务层校验,推荐方案1和方案3,适用于不同场景,感兴... 目录问题背景问题复现解决方案解决方案1.复合唯一索引 + 时间戳删除字段解决方案2:删除后修改唯一字

Ubuntu 24.04启用root图形登录的操作流程

《Ubuntu24.04启用root图形登录的操作流程》Ubuntu默认禁用root账户的图形与SSH登录,这是为了安全,但在某些场景你可能需要直接用root登录GNOME桌面,本文以Ubuntu2... 目录一、前言二、准备工作三、设置 root 密码四、启用图形界面 root 登录1. 修改 GDM 配

JSONArray在Java中的应用操作实例

《JSONArray在Java中的应用操作实例》JSONArray是org.json库用于处理JSON数组的类,可将Java对象(Map/List)转换为JSON格式,提供增删改查等操作,适用于前后端... 目录1. jsONArray定义与功能1.1 JSONArray概念阐释1.1.1 什么是JSONA

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

Linux下删除乱码文件和目录的实现方式

《Linux下删除乱码文件和目录的实现方式》:本文主要介绍Linux下删除乱码文件和目录的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下删除乱码文件和目录方法1方法2总结Linux下删除乱码文件和目录方法1使用ls -i命令找到文件或目录

Python中反转字符串的常见方法小结

《Python中反转字符串的常见方法小结》在Python中,字符串对象没有内置的反转方法,然而,在实际开发中,我们经常会遇到需要反转字符串的场景,比如处理回文字符串、文本加密等,因此,掌握如何在Pyt... 目录python中反转字符串的方法技术背景实现步骤1. 使用切片2. 使用 reversed() 函

Java操作Word文档的全面指南

《Java操作Word文档的全面指南》在Java开发中,操作Word文档是常见的业务需求,广泛应用于合同生成、报表输出、通知发布、法律文书生成、病历模板填写等场景,本文将全面介绍Java操作Word文... 目录简介段落页头与页脚页码表格图片批注文本框目录图表简介Word编程最重要的类是org.apach

Mysql实现范围分区表(新增、删除、重组、查看)

《Mysql实现范围分区表(新增、删除、重组、查看)》MySQL分区表的四种类型(范围、哈希、列表、键值),主要介绍了范围分区的创建、查询、添加、删除及重组织操作,具有一定的参考价值,感兴趣的可以了解... 目录一、mysql分区表分类二、范围分区(Range Partitioning1、新建分区表:2、分