Day55:动态规划 392.判断子序列 115.不同的子序列

2024-04-29 18:12

本文主要是介绍Day55:动态规划 392.判断子序列 115.不同的子序列,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

392. 判断子序列
 

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

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

进阶:

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

示例 1:

输入:s = "abc", t = "ahbgdc"
输出:true

示例 2:

输入:s = "axc", t = "ahbgdc"
输出:false

提示:

  • 0 <= s.length <= 100
  • 0 <= t.length <= 10^4
  • 两个字符串都只由小写字符组成。

思路:

(这道题也可以用双指针的思路来实现,时间复杂度也是O(n))

动态规划五部曲分析如下:

1.确定dp数组(dp table)以及下标的含义

dp[i][j] 表示以下标i-1为结尾的字符串s,和以下标j-1为结尾的字符串t,相同子序列的长度为dp[i][j]

统一以下标i-1为结尾的字符串来计算,这样在下面的递归公式中会容易理解一些

2.确定递推公式

if (s[i - 1] == t[j - 1]),那么dp[i][j] = dp[i - 1][j - 1] + 1

if (s[i - 1] != t[j - 1]),   那么dp[i][j] = dp[i][j - 1];

3.初始化

从递推公式可以看出dp[i][j]都是依赖于dp[i - 1][j - 1] 和 dp[i][j - 1],所以dp[0][0]和dp[i][0]是一定要初始化的。

4.确定遍历顺序

从递推公式可以看出dp[i][j]都是依赖于dp[i - 1][j - 1] 和 dp[i][j - 1],那么遍历顺序也应该是从上到下,从左到右

5.举例

代码:

class Solution {public boolean isSubsequence(String s, String t) {int [][] dp=new int[s.length()+1][t.length()+1];for(int i=1;i<dp.length;i++){for(int j=1;j<dp[i].length;j++){//dp[i][j] 表示以下标i-1为结尾的字符串s,//和以下标j-1为结尾的字符串t,相同子序列的长度为dp[i][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];}}}return dp[s.length()][t.length()]==s.length();}
}

115. 不同的子序列

给你两个字符串 s 和 t ,统计并返回在 s 的 子序列 中 t 出现的个数,结果需要对 109 + 7 取模。

示例 1:

输入:s = "rabbbit", t = "rabbit"
输出3
解释:
如下所示, 有 3 种可以从 s 中得到 "rabbit" 的方案rabbbit
rabbbit
rabbbit

示例 2:

输入:s = "babgbag", t = "bag"
输出5
解释:
如下所示, 有 5 种可以从 s 中得到 "bag" 的方案babgbag
babgbag
babgbag
babgbag
babgbag

思路:

这道题目如果不是子序列,而是要求连续序列的,那就可以考虑用KMP。

动态规划五部曲分析如下:

1.确定dp数组(dp table)以及下标的含义

dp[i][j]:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i][j]。

2.确定递推公式

s[i - 1] 与 t[j - 1]相等:

dp[i][j]可以有两部分组成。

一部分是用s[i - 1]来匹配,那么个数为dp[i - 1][j - 1]。即不需要考虑当前s子串和t子串的最后一位字母,所以只需要 dp[i-1][j-1]。

一部分是不用s[i - 1]来匹配,个数为dp[i - 1][j]。

dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];

s[i - 1] 与 t[j - 1] 不相等:

dp[i][j] = dp[i - 1][j];

3.初始化

那么dp[i][0]一定都是1,因为也就是把以i-1为结尾的s,删除所有元素,出现空字符串的个数就是1。

再来看dp[0][j],dp[0][j]:空字符串s可以随便删除元素,出现以j-1为结尾的字符串t的个数。

那么dp[0][j]一定都是0,s如论如何也变成不了t。

dp[0][0]应该是1,空字符串s,可以删除0个元素,变成空字符串t。

4.确定遍历顺序

从递推公式dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]; 和 dp[i][j] = dp[i - 1][j]; 中可以看出dp[i][j]都是根据左上方和正上方推出来的。所以遍历的时候一定是从上到下,从左到右

5.举例

代码参考:

 

class Solution {public int numDistinct(String s, String t) {int[][] dp=new int[s.length()+1][t.length()+1];//初始化for(int i=0;i<dp.length;i++){dp[i][0]=1;}for(int i=1;i<dp.length;i++){for(int j=1;j<dp[i].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];}}}return dp[s.length()][t.length()];}
}

这篇关于Day55:动态规划 392.判断子序列 115.不同的子序列的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

【回溯 栈 代数系统 动态规划】282. 给表达式添加运算符

本文涉及知识点 回溯 栈 代数系统 动态规划 LeetCode 282. 给表达式添加运算符 给定一个仅包含数字 0-9 的字符串 num 和一个目标值整数 target ,在 num 的数字之间添加 二元 运算符(不是一元)+、- 或 * ,返回 所有 能够得到 target 的表达式。 注意,返回表达式中的操作数 不应该 包含前导零。 示例 1: 输入: num = “123”, tar

C++牛客周赛题目分享(2)小红叕战小紫,小红的数组移动,小红的素数合并,小红的子序列求和

目录 ​编辑 1.前言 2.四道题目 1.小红叕战小紫 1.题目描述 2.输入描述 3.输出描述 4.示例 5.题解与思路 2.小红的数组移动 1.题目描述 2.输入描述 3.输出描述 4.示例 5.题解与思路 3.小红的素数合并 1.题目描述 2.输入描述 3.输出描述 4.示例 5.题解与思路 4.小红的子序列求和 1.题目描述 2.输入描述

智能制造数字工厂未来三年规划方案(80页ppt下载)

一、资料介绍 智能制造数字工厂未来三年规划方案是一份全面而深入的战略性文件,旨在指导我们公司在未来三年内实现智能制造领域的跨越式发展。这份80页的PPT资料,以“智能制造、智能制造系统、数字化工厂、数字孪生工厂、智能工厂和数字化车间”为核心关键词,系统阐述了我们的发展规划与实施策略。 关注【数据化运营圈】下载数字化转型解决方案 通过智能制造系统的构建,我们将实现生产流程的智能化管理与优化,提

蓝桥杯备战20.有奖问答_动态规划

P9230 [蓝桥杯 2023 省 A] 填空问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include<bits/stdc++.h>using namespace std;#define endl '\n'#define int long longconst int N = 2e5+10,M = 1e3+10;int f[M][M];signed ma

3-0. 超速判断

模拟交通警察的雷达测速仪。输入汽车速度,如果速度超出60 mph,则显示“Speeding”,否则显示“OK”。 输入格式: 输入在一行中给出1个不超过500的非负整数,即雷达测到的车速。 输出格式: 在一行中输出测速仪显示结果,格式为:“Speed: V - S”,其中V是车速,S或者是Speeding、或者是OK。 输入样例1: 40 输出样例1: Speed: 4

自查判断海外IP地址的质量,方式有这些!

为了保障海外代理IP的使用感受,在我们购买海外IP地址后,可以对其可靠性和安全性进行自查,避免潜在问题的发生,保障网络体验。 我们可以根据一下方法来进行自查判断: IP黑名单检查:使用IP黑名单检查工具,查询IP地址是否存在于黑名单中,以判断其干净程度。没有被列入黑名单的IP地址通常更可靠。 反向DNS查找:通过反向DNS查找工具,了解海外住宅IP的域名关联情况。与可信的、正规的域名相关

Modbus TCP转CAN网关在不同行业中的应用以及其使用上的优势

倍讯科技Modbus TCP转CAN网关通常被用于工业自动化领域,特别是在需要连接现有Modbus TCP网络和CAN总线设备的场景中。以下是该网关在不同行业中的应用以及其使用上的优势: 1. 制造业:    - 在制造业中,各种类型的设备和机器通常使用不同的通信协议。倍讯科技Modbus TCP转CAN网关可以帮助连接控制系统和现场设备,实现数据交换和控制,从而提高生产线的灵活性和效率。

hdu 2084(动态规划)

dp  题  从最简单的做起。 这种类型的题目就是一种思想,一种递归的思想,      就是从最开始的节点往后更新,用这个节点更新下一个节点,就是一直这么下去,一直传递。   #include<stdio.h>#include<stdlib.h>#include<algorithm>using namespace std;int a[105][105];void dp(int

MyBatis入门——动态SQL

前言 在我们日常工作中,使用MyBatis除了做一般的数据查询之外,还有很多业务场景下需要我们针对不同条件从数据库中获取到满足指定条件的数据,这时候我们应该如何来做呢?针对每种条件封装一个方法来使用?这肯定是不科学的,这样会导致项目中方法数量直线上升,大大增加了开发和维护的工作量。与之相反的就是把一些比较类似的查询操作封装为一个方法,然后通过传入条件不同来执行不同的SQL查询操作,这就需要使用到

sql动态游标创建

---例子CREATE PROCEDURE dbo.GetZYFZR@XMBH nvarchar(6),@ZY nvarchar(10)ASdeclare @RETURN nvarchar(2000)declare @TABLERY nvarchar(9)declare @XM nvarchar(20)declare @SQL nvarchar(200)set @RETURN=""set @TA