算法训练营第五十九天 | 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

相关文章

python panda库从基础到高级操作分析

《pythonpanda库从基础到高级操作分析》本文介绍了Pandas库的核心功能,包括处理结构化数据的Series和DataFrame数据结构,数据读取、清洗、分组聚合、合并、时间序列分析及大数据... 目录1. Pandas 概述2. 基本操作:数据读取与查看3. 索引操作:精准定位数据4. Group

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

Python操作PDF文档的主流库使用指南

《Python操作PDF文档的主流库使用指南》PDF因其跨平台、格式固定的特性成为文档交换的标准,然而,由于其复杂的内部结构,程序化操作PDF一直是个挑战,本文主要为大家整理了Python操作PD... 目录一、 基础操作1.PyPDF2 (及其继任者 pypdf)2.PyMuPDF / fitz3.Fre

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

MySQL 强制使用特定索引的操作

《MySQL强制使用特定索引的操作》MySQL可通过FORCEINDEX、USEINDEX等语法强制查询使用特定索引,但优化器可能不采纳,需结合EXPLAIN分析执行计划,避免性能下降,注意版本差异... 目录1. 使用FORCE INDEX语法2. 使用USE INDEX语法3. 使用IGNORE IND

C# $字符串插值的使用

《C#$字符串插值的使用》本文介绍了C#中的字符串插值功能,详细介绍了使用$符号的实现方式,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录$ 字符使用方式创建内插字符串包含不同的数据类型控制内插表达式的格式控制内插表达式的对齐方式内插表达式中使用转义序列内插表达式中使用

详解MySQL中JSON数据类型用法及与传统JSON字符串对比

《详解MySQL中JSON数据类型用法及与传统JSON字符串对比》MySQL从5.7版本开始引入了JSON数据类型,专门用于存储JSON格式的数据,本文将为大家简单介绍一下MySQL中JSON数据类型... 目录前言基本用法jsON数据类型 vs 传统JSON字符串1. 存储方式2. 查询方式对比3. 索引

Spring Boot配置和使用两个数据源的实现步骤

《SpringBoot配置和使用两个数据源的实现步骤》本文详解SpringBoot配置双数据源方法,包含配置文件设置、Bean创建、事务管理器配置及@Qualifier注解使用,强调主数据源标记、代... 目录Spring Boot配置和使用两个数据源技术背景实现步骤1. 配置数据源信息2. 创建数据源Be

Python使用openpyxl读取Excel的操作详解

《Python使用openpyxl读取Excel的操作详解》本文介绍了使用Python的openpyxl库进行Excel文件的创建、读写、数据操作、工作簿与工作表管理,包括创建工作簿、加载工作簿、操作... 目录1 概述1.1 图示1.2 安装第三方库2 工作簿 workbook2.1 创建:Workboo

MySQL字符串常用函数详解

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