代码随想录 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];


    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux指令(二)

&#x1f3a0;&#x1f3a0;&#x1f3a0;&#x1f3a0;&#x1f3a0;&#x1f3a0;&#x1f3a0;&#x1f3a0;&#x1f3a0;&#x1f3a0;&#x1f3a0;&#x1f3a0;&#x1f3a0;&#x1f3a0;&#x1f3a0;&#x1f3a0; &#x1f396;️&#x1f396;️&#x1f396;️&a…

C++入门,详解类和对象(1)

类和对象 一&#xff0c;前言二&#xff0c;类的介绍2.1类的引入2.2类的定义 三&#xff0c;类访问限定符及其分装3.1访问限定符说明 四&#xff0c;类的作用域五&#xff0c;类的实例化六&#xff0c;类对象模型6.1类的存储方式6.2类的大小计算 七&#xff0c;this指针7.1this…

​Unity Vuforia 新手(图片识别)教程,后续整理 实体识别 详细流程

文章目录 前言一、Vuforia是什么&#xff1f;二、Unity导入Vuforia1.去Unity - Windows – Asset Store&#xff0c;搜vuforia engine&#xff0c;添加到我的资源2.打开package Manager&#xff0c;导入到工程中即可3.或者在vuforia engine官网下载的Unity包导入4.检查是否导入…

选择最适合你的接口测试工具:SoapUI、JMeter、Postman!

在软件开发的过程中&#xff0c;接口测试是确保系统正常运行的关键环节。为了有效地执行接口测试&#xff0c;选择适当的工具至关重要。在这篇文章中&#xff0c;我们将比较分析三种常见的接口测试工具&#xff1a;SoapUI、JMeter和Postman&#xff0c;以帮助你了解它们的优势和…

TSINGSEE青犀视频平台EasyCVR修改设备通道不生效是什么原因?该如何解决?

视频监控TSINGSEE青犀视频平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;在视频监控播放上&#xff0c;TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放&#xff0c;可同时播放多路视频流&#…

黑马程序员微服务 第五天课程 分布式搜索引擎2

分布式搜索引擎02 在昨天的学习中&#xff0c;我们已经导入了大量数据到elasticsearch中&#xff0c;实现了elasticsearch的数据存储功能。但elasticsearch最擅长的还是搜索和数据分析。 所以今天&#xff0c;我们研究下elasticsearch的数据搜索功能。我们会分别使用DSL和Res…

智能导诊的开发技术有哪些?

智能导诊源码 智能导诊是医疗领域中一项重要的应用&#xff0c;它可以帮助医生和患者更快速、更准确地诊断疾病&#xff0c;提高医疗效率和精度。以下是智能导诊开发技术的几个方面: 1.数据收集整合 智能导诊系统需要收集大量的医疗数据&#xff0c;包括患者症状、病史、检查结…

Cesium 展示——绘制圆的几种方式(全面)

文章目录 需求分析1. 使用圆形几何体 椭圆(CircleGeometry):2. 使用多边形几何体 Polygon(PolygonGeometry):3. 使用自定义几何体(CustomGeometry):4. 使用线实体(polyline):其他需求 总结绘制圆的几种方式 分析 1. 使用圆形几何体 椭圆(CircleGeometry): …

OSS大文件分片上传

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、原理二、工具类二、注意事项总结 前言 最近做到项目中一个上传视频的功能&#xff0c;需要使用大文件分片上传&#xff0c;在网上找了一些资源借鉴&#xf…

PyCharm 【unsupported Python 3.1】

PyCharm2020.1版本&#xff0c;当添加虚拟环境发生异常&#xff1a; 原因&#xff1a;Pycharm版本低了&#xff01;不支持配置的虚拟环境版本 解决&#xff1a;下载PyCharm2021.1版本&#xff0c;进行配置成功&#xff01;

【大数据基础平台】星环TDH社区开发版单机部署

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;开着拖拉机回家_大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#…

创米云无代码开发:连接CRM、用户运营、广告推广,实现电商平台的高效集成

创米云无代码开发简介 作为一家专注于小程序开发的优质IT技术服务商&#xff0c;创米云提供了国内领先的自主研发的小程序开发工具。这款工具的制作过程无需任何代码&#xff0c;用户只需利用拖拽可视化组件即可完成小程序的开发。创米云的小程序开发工具拥有海量的小程序行业…

错误:ERROR:torch.distributed.elastic.multiprocessing.api:failed

在多卡运行时&#xff0c;会出现错误&#xff08;ERROR:torch.distributed.elastic.multiprocessing.api:failed&#xff09;&#xff0c;但是单卡运行并不会报错&#xff0c;通常在反向梯度传播时多卡梯度不同步。但我是在多卡处理数据进行tokenizer阶段报错&#xff0c;这竟然…

ZYNQ实验--Petalinux 安装

一、Petalinux 简介 PetaLinux是一个由Xilinx公司提供的嵌入式Linux开发工具套件&#xff0c;专门用于在Xilinx器件上构建、定制和部署嵌入式Linux系统。这个工具套件旨在简化嵌入式系统的开发过程&#xff0c;特别是针对使用Xilinx的可编程逻辑器件的系统。PetaLinux是Xilinx …

《信息安全原理与实践》(第3版):全面引领信息安全领域新潮流

在当今信息化社会的快速发展中&#xff0c;信息安全问题无疑是最为人们所关注的焦点之一。而《信息安全原理与实践》(第3版)的出版&#xff0c;无疑为解决这一问题提供了强大的理论和实践支持。 首先&#xff0c;这本书经过全面修订和更新&#xff0c;以适应信息安全领域日新月…

资产跟踪影响利润的 7 种方式

几乎每个工人都被托付某种有形资产来完成他们的工作。根据您的工作领域&#xff0c;这可能是一套制服、徽章、一台电脑、一部工作电话、一套建筑钥匙、一个工具包&#xff0c;甚至是一台价值超过您年薪的机器。 无论如何&#xff0c;我们都熟悉丢失您所保管的物品所带来的压力…

vite => .env 文件配置和使用

.env.development .env.production VITE_API_BASE_URL /api # 开发环境代理地址 .env.development 是在开发环境中的代理地址 .env.production 是在线上的代理地址 &#xff08; 两个 .env 内部的变量都是一样的 vite 会在你开发环境和线上环境自动做切换 &#xff09; …

flutter开发web应用支持浏览器跨域设置

开发web应用难免会遇到跨域问题&#xff0c;所以flutter设置允许web跨域的设置是要在你的flutter安装路径下面 flutter\bin\cache 找到flutter_tools.stamp文件&#xff0c;然后删除掉&#xff1a;这个文件是临时缓存文件 然后找到 flutter\packages\flutter_tools\lib\src\web…

树和森林 查找

讨论3.1 黄金分割查找&#xff1f; 在二分查找中&#xff0c;我们是取mid等于left和right的中间值&#xff0c;即用等分的方法进行查找. 那为什么一定要等分呐&#xff1f;能不能进行“黄金分割”&#xff1f;也就是midleft0.618(right-left),当然mid要取整数。如果这样查找&…

【腾讯云 HAI域探秘】浅尝一番AI绘画

前言 腾讯云高性能应用服务 HAI 是为开发者量身打造的澎湃算力平台。无需复杂配置&#xff0c;便可享受即开即用的GPU云服务体验。 我之前也参与锅一个AI绘画的活动&#xff0c;是基于InsCode的&#xff0c;都可以在线训练大模型&#xff0c;开发自己的AI应用程序。 这次腾讯…