Day55|392.判断子序列 、 115.不同的子序列

news2025/2/2 8:47:51

392.判断子序列

1.题目:

给定字符串 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

2.思路:

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

这道题应该算是编辑距离的入门题目,只需要计算删除的情况,不用考虑增加和替换的情况。

所以掌握本题的动态规划解法是对后面要讲解的编辑距离的题目打下基础

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

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

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

注意这里是判断s是否为t的子序列。即t的长度是大于等于s的。

2.确定递推公式

在确定递推公式的时候,首先要考虑如下两种操作,整理如下:

  • if (s[i - 1] == t[j - 1])
    • t中找到了一个字符在s中也出现了
  • if (s[i - 1] != t[j - 1])
    • 相当于t要删除元素,继续匹配

if (s[i - 1] == t[j - 1]),那么dp[i][j] = dp[i - 1][j - 1] + 1;,因为找到了一个相同的字符,相同子序列长度自然要在dp[i-1][j-1]的基础上加1(如果不理解,在回看一下dp[i][j]的定义

if (s[i - 1] != t[j - 1]),此时相当于t要删除元素,t如果把当前元素t[j - 1]删除,那么dp[i][j] 的数值就是 看s[i - 1]与 t[j - 2]的比较结果了,即:dp[i][j] = dp[i][j - 1];

其实这里 大家可以发现和 1143.最长公共子序列 (opens new window)的递推公式基本那就是一样的,区别就是 本题 如果删元素一定是字符串t,而 1143.最长公共子序列 是两个字符串都可以删元素。

3.dp数组如何初始化

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

这里大家已经可以发现,在定义dp[i][j]含义的时候为什么要表示以下标i-1为结尾的字符串s,和以下标j-1为结尾的字符串t,相同子序列的长度为dp[i][j]

因为这样的定义在dp二维矩阵中可以留出初始化的区间,如图:

392.判断子序列

如果要是定义的dp[i][j]是以下标i为结尾的字符串s和以下标j为结尾的字符串t,初始化就比较麻烦了。

4.确定遍历顺序

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

如图所示:

392.判断子序列1

  1. 5.举例推导dp数组

以示例一为例,输入:s = "abc", t = "ahbgdc",dp状态转移图如下:

392.判断子序列2

dp[i][j]表示以下标i-1为结尾的字符串s和以下标j-1为结尾的字符串t 相同子序列的长度,所以如果dp[s.size()][t.size()] 与 字符串s的长度相同说明:s与t的最长相同子序列就是s,那么s 就是 t 的子序列。

图中dp[s.size()][t.size()] = 3, 而s.size() 也为3。所以s是t 的子序列,返回true。

3.代码:

public boolean isSubsequence(String s, String t) {
        //dp编辑距离问题
        int[][] dp=new int[s.length()+1][t.length()+1];
        for(int i=1;i<s.length()+1;i++){
            for(int j=1;j<t.length()+1;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.不同的子序列  

1.题目:

给你两个字符串 s 和 t ,统计并返回在 s 的 子序列 中 t 出现的个数。

题目数据保证答案符合 32 位带符号整数范围。

 示例 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

115.不同的子序列

3.代码:

 public int numDistinct(String s, String t) {
        //dp
        int[][] dp=new int[s.length()+1][t.length()+1];
        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];
                }
            }
        }
        return dp[s.length()][t.length()];
    }

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第五章内存系统(Cortex-M7 Processor)

目录 第五章内存系统 5.1关于内存系统 5.2&#xff08;Speculative&#xff09;推测性访问 5.2.1系统设计注意事项 5.3故障处理 5.3.1故障 5.3.2使用模型 5.4内存类型和内存系统行为 5.5AXIM接口 5.5.1AXI属性和事务 5.5.2用于AXIM接口访问的标识符 5.5.3AXI特权信息 5.…

Python案例分析|文本相似度比较分析

本案例通过设计和实现有关文本相似度比较的类Vector和Sketch&#xff0c;帮助大家进一步掌握设计Python类来解决实际问题的能力。 01、文本相似度比较概述 通过计算并比较文档的摘要可实现文本的相似度比较。 文档摘要的最简单形式可以使用文档中的k-grams&#xff08;k个连…

springboot第30集:springboot集合问题

Logstash Logstash 是开源的服务器端数据处理管道&#xff0c;能够同时从多个来源采集数据、格式化数据&#xff0c;然后将数据发送到es进行存储。 ElasticSearch Elasticsearch 是基于JSON的分布式搜索和分析引擎&#xff0c;是利用倒排索引实现的全文索引。 KibanaKibana 能够…

低代码项目实战第一弹!2人14天快速构建电商企业供应链管理平台(一)

一、前言&#xff1a;项目背景 项目情况&#xff1a;一家主要通过电商平台销售日用清洁用品的企业&#xff0c;淘宝垂直品类第一&#xff0c;销售模式包括自营和代理商两种模式&#xff0c;平时用旺店通ERP进行订单管理和财务结算。并且客户公司有小的开发团队&#xff0c;可以…

Java日期类

日期类 第一代日期类&#xff1a; 1、Date&#xff1a;精确到毫秒&#xff0c;代表特定的瞬间 2、SimpleDateFormat&#xff1a; **格式化和解析日期的具体类&#xff0c;**它允许进行&#xff1a;格式化(日期 → 文本) 解析(文本 → 日期) 和 规范化。 3、常用的使用方法…

sentinel介绍-分布式微服务流量控制

官网地址 https://sentinelguard.io/ 介绍 随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件&#xff0c;主要以流量为切入点&#xff0c;从流量路由、流量控制、流量整形、熔断降级、系统自…

MySQL 知识连载(一)

点击上方↑“追梦 Java”关注&#xff0c;一起追梦&#xff01; MySQL 是一款开源软件&#xff0c;凭借其出色的性能&#xff0c;目前已经成为绝大多数互联网公司的首选关系型数据库。因此程序员不能只懂数据库的增删改查和一些简单的使用技巧&#xff0c;更需要熟练掌握 MySQL…

MySQL八股学习历程3MySQL数据页的格式from小林coding

MySQL八股学习历程3MySQL数据页的格式from小林coding InnoDB数据页MySQL单表建议数据承载量探究 InnoDB数据页 InnoDB 的数据是按数据页为单位来读写的,每个数据页大小默认为16KB,数据页的格式如下图 文件头中有两个指针,指向上一个数据页和下一个数据页,使得页面连接成一个…

大佬带你体验华为云代码检查服务CodeArts Check

1 开发者的自述 作为开发者&#xff0c;刚开始都不希望有任何针对他代码的批评&#xff0c;因为一旦知道代码被检测出问题&#xff0c;就会付出额外的努力做好工作&#xff0c;实际上&#xff0c;从一个开发人员的编码中&#xff0c;你能更清楚地了解编程语言可以做什么&#…

单片机裸机程序框架是怎样的?

单片机裸机程序框架指的是在单片机上进行编程时&#xff0c;不依赖任何操作系统或高级库的纯裸机编程框架。这意味着你需要直接操作底层硬件和寄存器&#xff0c;以完成特定的任务。下面是一个典型的单片机裸机程序框架&#xff0c;以C语言为例&#xff1a; // 头文件包含&…

分布式kmeans(scala原码实现)

scala分布式kmeans 1.分布式Kmeans算法设计思路2.分布式Kmeans算法代码实现2.1 Driver&#xff08;主要负责分配、汇总数据&#xff09;2.2 Executor&#xff08;主要负责计算&#xff09;2.3 Executor2&#xff08;主要负责计算&#xff09; 3.分布式Kmeans算法spark集群部署3…

如何解决笔记本电脑键盘失灵的问题:3个简单而有效的解决方法

当你使用笔记本电脑时&#xff0c;可能会遇到键盘失灵的情况&#xff0c;这是一件非常令人恼火的事情。然而&#xff0c;不要担心&#xff0c;下面将为你提供三个简单而有效的解决方法。 首先&#xff0c;检查连接和驱动程序。请确保键盘与笔记本电脑的连接正常&#xff0c;有时…

数据结构与算法之美总结(数组、链表、栈、队列、递归、排序及二分)

title: 数据结构与算法之美总结&#xff08;数组、链表、栈、队列、递归、排序及二分&#xff09; date: 2023-04-15 01:41:26 tags: 数据结构算法 categories:数据结构与算法 cover: https://cover.png feature: false 1. 前言 1、什么是数据结构&#xff1f;什么是算法&…

SpringCloud Alibaba组件之Seata安装部署

seata server&#xff08;TC&#xff09; 部署 部署指南&#xff1a;https://seata.io/zh-cn/docs/ops/deploy-guide-beginner.html 下载地址&#xff1a;https://github.com/seata/seata/tags 版本对应关系&#xff1a;SpringCloud Alibaba 组件对应关系说明 下载 通过查…

Minio部署总结

官方介绍 MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口&#xff0c;非常适合于存储大容量非结构化的数据&#xff0c;例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等&#xff0c;而一个对象文件可以是任意大小&#xf…

一文搞懂数据库索引原理

前言 写数据库&#xff0c;我第一时间就想到了MySQL、Oracle、索引、存储过程、查询优化等等。 不知道大家是不是跟我想得一样&#xff0c;我最想写的是索引&#xff0c;为啥呢&#xff1f; 以下这个面试场景&#xff0c;不知道大家熟悉不熟悉&#xff1a; 面试官&#xff1a;数…

郑州网站域名升级https通配符证书

新创建的网站如果没有安装SSL证书&#xff0c;在客户端与服务器传输信息时会使用明文传输&#xff0c;明文传输的数据容易被其他人截获或者插入违法信息&#xff0c;会对网站所有者和访问网站的客户带来危害。而部署了SSL证书将网站域名由http升级为https&#xff0c;会在客户端…

【PHP面试题51】Swoole是什么?有什么特点,主要解决了什么问题

文章目录 一、前言二、什么是Swoole&#xff1f;三、如何使用Swoole&#xff1f;四、Swoole主要解决了什么问题&#xff1f;4.1 高性能4.2 高并发4.3 异步编程4.4 多协议支持 五、总结 一、前言 本文已收录于PHP全栈系列专栏&#xff1a;PHP面试专区。 计划将全覆盖PHP开发领域…

jdk1.8安装教程及环境变量配置(含jdk8,11,13安装文件)

目录 友情提醒第一章、JVM、JRE、JDK介绍第二章、下载和安装JDK2.1&#xff09;百度网盘直接下载免安装2.2&#xff09;官网下载安装JDK&#xff08;需要收费&#xff09; 第三章、环境变量配置3.1&#xff09;windows环境变量配置3.2&#xff09;验证环境变量是否配置成功 友情…

spark启动HA时workers为0,且为standby状态

今天学习一个spark视频&#xff0c;在启动StandAloneHa模式的时候&#xff0c;发现workers为0&#xff0c;而且spark两个master的状态都为standby&#xff0c;找了很久&#xff0c;才知道我用的spark3.2 最低支撑的zookeeper版本为3.5.x,而且zookeeper的安装包是需要带bin的那个…