代码随想录 Day46 动态规划14 LeetCode T392 判断子序列 T115 不同的子序列

LeetCode T392 判断子序列 

题目链接:392. 判断子序列 - 力扣(LeetCode)

题目思路:

本题有两种思路,第一个思路是使用双指针,第二个思路是使用动态规划,结尾笔者会附上两种方法的代码.

1.双指针

首先我们谈双指针的思路,就是让两个指针分别指向s和t字符串的开头,只要遇到相同字母,两者同时向后走一步,如果没有遇到字符相同,则只有t指针向后走,最后只要判断走完不管是s或者是t先走完,只要判断s对应的指针下标大小是否和其长度一样即可

2.动态规划(和最长公共子序列基本一样)

2.1 明确dp数组含义

dp数组表示的是结尾为i-1和结尾为j-1的s和t字符串匹配的字符数量

2.2 明确dp数组递推公式

如果遇到相等就是dp[i][j] = dp[i-1][j-1] + 1

不相等就是 dp[i][j] = dp[i-1][j] 

2.3 初始化dp数组

无需初始化

2.4 明确遍历顺序

顺序遍历即可

2.5 打印dp数组排错

题目代码:

//动态规划
class Solution {public boolean isSubsequence(String s, String t) {int len1 = s.length();int len2 = t.length();int[][] dp = new int[len1+1][len2+1];for(int i = 1;i<=len1;i++){char c1 = s.charAt(i-1);for(int j = 1;j<=len2;j++){char c2 = t.charAt(j-1);if(c1 == c2){dp[i][j] = dp[i-1][j-1]+1;}else{dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);}}}if(dp[len1][len2] == len1){return true;}else{return false;}}
}//双指针class Solution {public boolean isSubsequence(String s, String t) {int len1 = s.length();int len2 = t.length();int i = 0,j = 0;while(i<len1 && j<len2){if(s.charAt(i) == t.charAt(j)){i++;j++;}else{j++;}}return i == len1;}
}

LeetCode T115 不同的子序列

题目链接:115. 不同的子序列 - 力扣(LeetCode)

题目思路:

1确定dp数组含义

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

2.确定递推公式

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

当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]。

举例,假设s = 'rara',t = 'ra'

这时候我们用最后一个a,那么其实s的最后一个a消掉,t的最后一个a也消掉,那么其实就是   dp[i-1][j-1]

这个时候如果不用最后一个字母a,就是在前面''rar''看有没有''ra'',就是dp[i-1][j]

当最后一个字母不同的时候,其实也不用考虑了,比如'rarb'这里b也用不上呀,只能向前看      dp[i-1][j]是否有满足条件的结果

3.初始化dp数组

dp[i][0] 表示:以i-1为结尾的s可以随便删除元素,出现空字符串的个数。

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

4.确定遍历方式

从前向后遍历,因为后者依赖前者产生

5.打印数组排错

题目代码:

class Solution {public int numDistinct(String s, String t) {int len1 = s.length();int len2 = t.length();int[][] dp = new int[len1+1][len2+1];for(int i = 0;i<len1+1;i++){dp[i][0] = 1;}for(int i = 1;i<=len1;i++){char c1 = s.charAt(i-1);for(int j = 1;j<=len2;j++){char c2 = t.charAt(j-1);if(c1 == c2){dp[i][j] = dp[i-1][j-1] + dp[i-1][j];}else{dp[i][j] = dp[i-1][j];}}}return dp[len1][len2];}
}

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

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

相关文章

es安装方式

es安装方式 1.下载镜像的方式 分词器 kibana和es和容器互通的方式 docker network create es-net开始拉去镜像的方式 docker pull kibana:7.12.1运行镜像的方式 docker run -d \--name es \-e "ES_JAVA_OPTS-Xms512m -Xmx512m" \-e "discovery.typesingle-…

时间序列预测各类算法探究上篇

前言&#xff1a; 最近项目需要对公司未来业绩进行预测&#xff0c;以便优化决策&#xff0c;so 研究一下时序算法。纯个人理解&#xff0c;记录以便备用&#xff08;只探究一下原理&#xff0c;所有算法都使用基本状态&#xff0c;并未进行特征及参数优化&#xff09;。 环境…

2023年【道路运输企业安全生产管理人员】证考试及道路运输企业安全生产管理人员模拟考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年道路运输企业安全生产管理人员证考试为正在备考道路运输企业安全生产管理人员操作证的学员准备的理论考试专题&#xff0c;每个月更新的道路运输企业安全生产管理人员模拟考试题祝您顺利通过道路运输企业安全生…

【数据结构】直接插入排序

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;数据结构 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵 希望大佬指点一二 如果文章对你有帮助…

纳米软件分享:电源芯片测试指标与测试注意事项

电源芯片测试旨在检测电源管理芯片的质量和性能&#xff0c;保证其可以长期稳定工作。电源芯片测试的参数主要有输入/输出电压、输出电流、效率、温度、功耗等。本文将对电源芯片测试参数以及测试注意事项进行介绍。 电源管理芯片的测试参数 1. 输入电压范围 指电源芯片正常工作…

【论文精读2】R-MVSNet

R-MVSNet【递归多视图立体网络】&#xff0c;论文全名&#xff1a;“Recurrent MVSNet for High-resolution Multi-view Stereo Depth Inference”&#xff0c;CVPR 2019(CCF A) 在MVSNet的基础上做了一些改进&#xff0c;主要解决的问题是代价体正则化&#xff08;Cost Volume…

mysql之搭建MHA架构实现高可用

1、定义 全称是masterhigh avaliabulity。基于主库的高可用环境下可以实现主从复制及故障切换&#xff08;基于主从复制才能故障切换&#xff09; MHA最少要求一主两从&#xff0c;半同步复制模式 2、作用 解决mysql的单点故障问题。一旦主库崩溃&#xff0c;MHA可以在0-30…

入站一个月涨粉80万!B站竖屏UP主如何突出重围?

B站仍然秉持着“内容为王”的社区氛围&#xff0c;这也是众多UP主们一同坚持的事。不管是今年宣布的Story Mode竖屏模式开放还是14周年庆上B站董事长兼CEO陈睿宣布作品播放量改播放分钟数等等改动来看&#xff0c;都能感受到B站在向更多优质创作者招手&#xff0c;并维护着优质…

第四代管网水位监测仪:管网水位监测仪使用方法

排水管网水位监测是城市管理的重要环节之一&#xff0c;城市管理部门一直都想要确保排水管网的正常运行&#xff0c;以此促进城市的发展和智慧城市的建设。想要依靠人工对城市排水管网设施进行检修是一个大工程&#xff0c;不仅要耗费大量的人工和时间成本&#xff0c;还有可能…

SCons

什么是构建工具&#xff08;系统&#xff09; 构建工具&#xff08;software construction tool&#xff09;是一种软件&#xff0c;它可以**根据一定的规则或指令&#xff0c;将源代码编译成可执行的二进制程序。**这是构建工具最基本也最重要的功能。 实际上构建工具的功能…

Kafka 的应用场景

Kafka 是一个开源的分布式流式平台&#xff0c;它可以处理大量的实时数据&#xff0c;并提供高吞吐量&#xff0c;低延迟&#xff0c;高可靠性和高可扩展性。 Kafka 最初是为分布式系统中海量日志处理而设计的。它可以通过持久化功能将消息保存到磁盘&#xff0c;并让消费者按…

移远EC600U-CN开发板 11.15

制作一个简单UI: 1."端口设置"模块 *效果图 *代码 def backEvent(evt): #返回主界面code evt.get_code() if code lv.EVENT.CLICKED:lv.scr_load(mainInterface)def popUpEvent(evt): #弹窗提醒code evt.get_code()if code lv.EVENT.CL…