java数据结构与算法刷题-----LeetCode392. 判断子序列

NVIDIA 2025 Board Design Engineer 校招笔试 电路分析,矩形波阶跃反馈驱动​,误差信号。非常简单,数电or​离散基础。第一题是考试规矩知情确认。大二暑假做的,纯体验​。五六题太长,下篇分享。 阅读详情
java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.youkuaiyun.com/grd_java/article/details/123063846

在这里插入图片描述

1. 双指针

解题思路:时间复杂度O( s + t s+t s+t)两个字符串都遍历的一遍,空间复杂度O( 1 1 1)
  1. 一个指针指向s的字符,一个指针指向t的字符
  2. 如果两个字符对应,则匹配成功一个字符,两个指针一起后移
  3. 如果两个字符没有对应上,则t的指针后移,试图继续和s的当前字符匹配
代码

在这里插入图片描述

class Solution {
    public boolean isSubsequence(String s, String t) {
        int sLen = s.length(),tLen = t.length();
        char[] sCA = s.toCharArray(),tCA = t.toCharArray();
        int sIndex = 0;//s字符串的指针
        for(int i = 0;i<tLen;i++){//t字符串的指针
            //如果t当前字符,满足s当前字符,则sIndex后移,匹配下一个s中的字符
            if(sIndex<sLen && sCA[sIndex] == tCA[i]) sIndex++;
        }
        return sIndex == sLen;//如果s中字符完美进行匹配,返回true
    }
}

2. 动态规划

上面的方法时间复杂度很低,但是如果有1亿个s想要判断是否是t的子序列,就必须先对t进行预处理,也就是只有预处理的时候会慢,之后处理s的时候,会非常快。

  1. 前缀树,把t所有可能得前缀预处理,后续直接用s匹配即可
  2. 动态规划仿前缀树。使用二维数组,保存如果想在当前位置之后找到特定字母,是否可以找到,如果能找到,应该跳转到哪个位置找
    在这里插入图片描述
解题思路:时间复杂度O( t ∗ 26 + s t*26 + s t∗26+s),空间复杂度O( t ∗ 26 t*26 t∗26)
  1. 时间复杂度:26是因为t和s由26个字母组成。dp数组预处理的时间复杂度是O( t ∗ 26 t*26 t∗26)。之后查找t的子序列,时间复杂度最多不超过O( s s s),也就是完全可以匹配时,才会消耗s时间复杂度,而如果s中只有一个字母可以完成匹配,则与dp数组比较2次即可判断无法完全匹配成功
动态规划思考5步曲
  1. DP数组及下标含义

我们要求出的是在t字符串的i以及i之后的位置,想要匹配指定字母,是否可以匹配到,如果能应该去哪个位置匹配,那么dp数组中存储的就是当前i位置为起始,最近的一个指定字母出现的位置。要求出谁的位置。显然是到达i位置后,指定字母的出现位置,那么下标就是代表现在到了t字符串哪个位置,我们要在当前位置找哪个字母。显然,需要两个下标表示,一个下标代表当前t的位置,另一个下标表示我们接下来想要匹配的是26个字母中的哪一个。故这道题的dp数组需要二维数组

  1. 递推公式
  1. 假设t字符串的长度为m,我们建立dp大小为dp[m][26]. 因为下标从0开始,正好dp[m-1]是t的最后一个字符位置。而dp[m]行表示字符串结束位置。
  2. 我们先将dp[m]行全部赋值为m,表示在当前位置匹配任何字母都是匹配不到的
  3. 然后处理dp[m-1]也就是t的最后一个位置。假设t最后一个位置是a.那么dp[m-1][0]位置,就表示t的最后一个位置为a字母。将其设置为m-1. 而其余字母位置,dp[m-1][1-26]都为m(dp[m][1-26]),表示从m-1位置找除了a以外的字母,都是找不到的。
  4. 同理,dp[m-2]行也就是t的倒数第二个位置
  1. 假设这个位置字母也是a,那么对于dp[m-2][0] = m-2,表示m-2行找字母a,m-2行就是最近的位置,其余位置都为m-1行的状态 = dp[m-1][1-26]
  2. 假设这个位置是b。那么对于dp[m-2][1] = m-2,表示m-2行找字母b,m-2行就是最近的位置
  3. 而dp[m-2][0] = dp[m-1][0] = m-1,为什么?因为我们知道dp[m-1]位置字母是a,那么我们现在想在m-2后面找a的最近出现位置,那么自然是m-1位置。
  1. 因此递推公式为
  1. m行dp[m][1-26] = m,表示m是不可达区间,m表示当前位置和之后的位置找指定字母是找不到的
  2. 其余的dp[i][j],如果t[i] = j 则dp[i][j] = i.表示如果当前i位置出现字母是j,那么当前位置及之后,j字母最早出现位置就是i
  3. 而剩余的t[i] != j的位置,dp[i][j] = dp[i+1][j].表示如果当前i位置出现字母不是j,那么去问问i+1行吧
  1. dp数组初始化

在这里插入图片描述

  1. 数组遍历顺序:肯定是先行后列,因为行是当前t的字符位置,列是26个字母中的哪一个。主角是对t进行预处理,所以先行后列
  2. 打印dp数组(自己生成dp数组后,将dp数组输出看看,是否和自己预想的一样。)

在这里插入图片描述

代码

在这里插入图片描述

class Solution {
    //前缀树,使用动态规划简单实现前缀树
    public boolean isSubsequence(String s, String t) {
        int n = s.length(), m = t.length();
        //对t建立dp数组,每个位置都有26种可能(因为t是由26个字母组成)
        //dp数组含义:dp[i:第几个位置][j:要找26个字母的哪个] = 在当前i和后面[i,m]的位置,最近的j字母的位置
        //简单来讲,我们想要实现,匹配s的每一个字符时,可以直接获取应该去t的哪一个位置匹配
        int[][] f = new int[m + 1][26];
        //m是t字符串之外的地方,我们将其设置为不可达,也就是匹配不到
        for (int i = 0; i < 26; i++) f[m][i] = m;//将匹配不到,设置为m
        //自底向上规划
        for (int i = m - 1; i >= 0; i--) {
            for (int j = 0; j < 26; j++) {//每一个行的每个字母都要处理
                //如果t当前行(i位置),存放的正好是j。则f[i][j] = i.表示第i行匹配j字母的最近位置 = i
                if (t.charAt(i) == j + 'a')f[i][j] = i;
                //如果存放的不是j,那么想要在当前位置找j,就得去下一行找。也就是f[i+1][j],看看这一行有没有
                else f[i][j] = f[i + 1][j];
            }
        }
        //规划完成后,开始匹配
        int add = 0;//dp数组的行,也就是t的下标
        for (int i = 0; i < n; i++) {
            //如果当前add行匹配s[i]字母时,发现最近的一个s[i]字母 = m行,也就是匹配不到的含义,则返回false
            if (f[add][s.charAt(i) - 'a'] == m) return false;
            //如果当前位置发现最近的一个s[i]字母 != m ,说明后面有这个字母
            //则直接跳到这一行完成匹配,然后去下一行,匹配s[i+1]字母
            add = f[add][s.charAt(i) - 'a'] + 1;
        }
        return true;//匹配完成则返回true
    }
}
UE4 Instanced Mesh 半透明渲染顺序不对解决 以绿色方块为Instanced Mesh为例。 正确的半透应该是这样的: 这是一般蓝图Actor方块,其半透是正常的。 然而Instanced Mesh因为过多,UE4不给你缓存正确的渲染顺序。所以,在不改代码的情况下,想解决Instanced Mesh半透问题,是不可能的。不正确的半透如下: 注意到错误发生在Instanced Mesh的方块与方块之间。 但我就是要解决,... 阅读详情

相关推荐

Dify学习笔记-知识库(六)

Dify学习笔记-知识库

大数据知识梳理 2万+

LeetCode题练习与总结:判断子序列--392

本文详细介绍了如何判断字符串s是否为字符串t的子序列,包括基本实现和进阶问题的解决方案,涵盖了双指针法、预处理和二分查找等知识点,为高效处理大量输入提供了优化思路。

一直学习永不止步 1060

MLC-LLM框架在安卓设备上的模型编译与部署全流程解析

本文详细解析了如何利用MLC-LLM框架在安卓设备上编译与部署大语言模型。从环境搭建、模型获取与量化编译,到最终的安卓应用打包与调试,提供了完整的实战流程。重点介绍了如何通过MLC-LLM将大型模型优化为适合移动端运行的格式,实现本地、低延迟、隐私安全的AI应用部署。

weixin_29251337的博客 475

LeetCode 392. Is Subsequence 题解——Java

题目链接:https://leetcode.com/problems/is-subsequence/#/description 题目要求:判断字符串s是不是字符串t的子序列 方法一: 首先想到的方法是,使用两个队列分别报错两个字符串中的各个字符,依次比较队首元素,若两个队列的队首元素相同,则表示到目前为止,s的前x个字符可以匹配为t的子序列;如果两个队列的队首元素不相同,则将t队列的

xiaoyi357的博客 954

HMC7044芯片模拟SPI配置

摘要: HMC7044是一款高性能双环路整数N分频抖动衰减器,支持SPI接口配置,适用于高速数据转换器时钟系统。该芯片采用双PLL级联架构,具有14路可配置输出,可满足GSM/LTE基站设计需求。SPI接口采用3线模式(SLEN/SCLK/SDATA),支持24位寄存器读写(13位地址+8位数据)。驱动实现基于Zynq EMIO模拟SPI,提供初始化、数据传输及寄存器配置功能,支持三线制工作模式和多种时钟参数设置。

toonyhe的博客 1099

30. 如何使用 SEGW 的 redefine 功能对 SAP 标准 OData 服务进行扩展

SAP 发布了很多标准的 Fiori 应用,可以通过笔者的文章里提到的进行浏览。比如 My Opportunities 就是 SAP CRM 领域的一个 Fiori 应用:下图是 Opportunity 明细页面的 Info 标签页:假设我们想在这些标准字段的末尾增添一个新字段 Created By,用来维护当前 Opportunity 的创建者。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1176

Leetcode 392(Java)

Given a string s and a string t, check if s is subsequence of t.You may assume that there is only lower case English letters in both s and t. t is potentially a very long (length ~= 500,000) string, an

catttbao的博客 442

养龙虾之_因特尔UHD/ULtra/Arc核显跑大模型_安装ollama_跑qwen3.5:0.8b/9b_使用copaw1.0.1测试_并配置copaw技能效果炸裂---AI大模型应用探索0019

摘要:本文探讨了利用Intel UHD770核显运行大语言模型的可能性。通过使用Intel发布的ipex-llm项目工具包,成功在核显上运行了Qwen3.5系列模型。测试发现0.8B小模型运行流畅(3-5秒响应),但智能程度有限;而9B大模型虽然效果更好,但响应时间长达2分钟,且GPU/CPU占用率不高。实验证明Intel核显确实可以运行LLM,但实际效果和性能表现仍有提升空间,特别是对大模型的支持尚不理想。

添柴程序猿的专栏 239

【leetcode刷题】65.判断子序列 ——Java版

双指针

公号:一条coding 1万+

rk3568 rk628桥片hdmi转lvds

RK628 是瑞芯微全新推出的视频桥接芯片,支持丰富的显示接口,支持高分辨率大屏产品转换需求。基于DRM、FB的显示框架易于使用。 输入信号支持:HDMI、RGB、BT.1120,输出信号支持 HDMI、GVI、Dual LVDS、Dual MIPI、MIPI-CSI、RGB、BT.1120,最高支持4K 60fps 输入/输出转换,并且支持输入到输出 1/4~4倍的缩放。

weixin_35723192的博客 1131

全面绩效管理:提升整体效能

《全面绩效管理:提升整体效能》 关键词:绩效管理、整体效能、团队绩效、个体绩效、领导力、数字化转型 摘要:本文从绩效管理的基础概念入手,深入探讨了绩效管理体系构建、绩效指标

AI天才研究院 604

【简单】力扣算法题解析LeetCode392:判断子序列

LeetCode 392题要求判断字符串s是否为t的子序列(字符顺序一致,可不连续)。采用双指针法:指针i遍历s,j遍历t,匹配成功则移动i,最终若i遍历完s则返回true。时间复杂度O(n),空间复杂度O(1)。核心代码通过单次遍历t完成匹配,处理边界条件如空字符串或s长度大于t时直接返回。典型用例包括完全匹配(s="abc", t="ahbgdc"→true)和部分缺失(s="axc"→false)。

ylumwd的博客 966

从数据到行动:客服运营必分析的8大核心维度

服务运营正从被动响应升级为数据驱动型战略体系。客服中心的海量交互数据能精准反映服务效能、客户体验及运营短板,关键在于实现数据的可视化与可操作化。本文系统剖析了八类核心数据指标:1)客户行为数据(CSAT/NPS/投诉内容);2)通话效率指标(AHT/接通率);3)服务质量(质检体系/情绪识别);4)坐席绩效(FCR/客户评价);5)流程与知识库(转接率/工单时效);6)渠道流量分析;7)异常预警机制;8)成本收益模型。通过构建多维数据分析体系,企业可在客户全生命周期管理中实现服务升级、风险防控与资源

2202_75469062的博客 1401

【经典算法】LeetCode 392 判断子序列(Java/C/Python3/Go实现含注释说明,Easy)

作者主页: 🔗精选专栏:🔗作者简介:阿里非典型程序员一枚 ,记录在大厂的打怪升级之路。一起学习Java、大数据、数据结构算法(关注,持续更新🤞。

1426

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【数据结构和算法】判断子序列

给定字符串s和t,判断s是否为t的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。 进阶: 如果有大量输入的 S,称作 S1, S2, ... , Sk 其中 k >= 10亿,你需要依次检查它们是否为 T 的子序列。在这种情况下,你会怎样改变代码?

船到桥头自然直 1212

贝叶斯统计 [韦来生编]

贝叶斯(Bayes)统计是近几十年来迅速发展起来的数理统计的一个重要分支。贝叶斯方法与经典统计方法的主要不同之处是进行统计推断时除了利用样本信息外,还要利用参数的先验信息,因此可以提高统计推断或统计决策的效果。它在经济、金融、生物、医学、自然科学和社会科学等许多领域具有广泛的应用。贝叶斯方法的研究已渗透到了统计学的几乎所有领域。作者在给中国科学技术大学概率论与数理统计专业本科生开设的“数理统计”课程中有一章专门讲授“贝叶斯方法和统计决策理论”,近十年来也给中国科学技术大学概率统计专业研究生开设过几次“贝叶斯分析”课。本书是在对过去讲稿的内容作了适当的增减和调整的基础上完成的。  本书共分六章。第1章是绪论,介绍了贝叶斯统计的若干基本概念,同时对必要的数理统计的基础知识有重点地作了回顾。第二章介绍了确定先验分布的若干可供选择的方法。第三章介绍了几类常见统计模型参数的后验分布的主要结果和计算方法。第四章和第五章分别介绍了“贝叶斯统计推断”和“贝叶斯统计决策”的内容。第六章介绍了贝叶斯统计计算的若干方法,包括蒙特卡洛方法和马尔可夫链蒙特卡洛(MCMC)方法以及相关统计软件的简介。本书的每一章附右大量的例题和习题,书末附有常用的几个表格和部分习题解答供读者查用。  大约可在54学时内讲授本书的第1章至第六章的主要内容,教师可根据学时需要选讲本书第1章至第六章的部分内容。书中标“*”号的章节可略去不讲,留给读者作为阅读材料。第六章例题中的R代码和部分例题的数据文件等可从作者个人主页下载。  作者在编写本书的过程中参考了J.O.Berger教授的《统计决策论及贝叶斯分析》和茆诗松教授编写的《贝叶斯统计》等书中的一些内容,以及《贝叶斯分析》一书中由张伟平博士编写的有关贝叶斯统计计算的一些内容。在此表示衷心感谢。  本书编写准备过程中,中国科学技术大学统计与金融系的几个研究生帮助完成了本书部分中文的录入和排版,作者对他们的辛勤工作表示真诚的感谢。高等教育出版社为本书的出版给予了大力支持。在此一并致谢。

Java实现 LeetCode 392 判断子序列

392. 判断子序列 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 你可以认为 s 和 t 中仅包含英文小写字...

5383

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【力扣】392. 判断子序列

给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 你可以认为 s 和 t 中仅包含英文小写字母。字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 <=100)。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。 示例 1: s = “abc”, t = “ahbgdc” 返回 true. 示例 2: s = “axc”, t = “ahbgd

qq_39380838的博客 233

力扣每日练习 - 392 判断子序列

题目描述: 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 你可以认为 s 和 t 中仅包含英文小写字母。字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 <=100)。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。 示例 1: s = “abc”, t = “ahbgdc” 返回 true. 示例 2: s = “axc”,

背着梦的幸存者 334

LeetCode - 双指针 - 392. 判断子序列

题目 392. 判断子序列 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 你可以认为 s 和 t 中仅包含英文小写字母。字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 <=100)。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。 示例 1: s = “abc”, t = “ahbgdc” 返回 true. 示例 2: s = “

-happy 的博客 320

代码随想录算法训练营Day49 | 1143. 最长公共子序列、1035.不相交的线、53. 最大子数组和、392.判断子序列

训练营第49天:1143. 最长公共子序列、1035.不相交的线、53. 最大子数组和、392.判断子序列

jiabao0520的博客 1272

leetcode 392. 判断子序列

给定字符串 s 和 t ,判断s 是否为 t 的子序列。 你可以认为 s 和 t 中仅包含英文小写字母。字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 <=100)。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。 题解: 1.字符串 s 和 t 2.判断s 是否为 t 的子序列 3.字符串匹配过程中,相对位置不能改变,剩余字...

j_thame_myhome的博客 326

Leetcode 每日一题 392.判断子序列

的检查,我们可以使用更高效的算法,比如后缀数组或后缀树,这些数据结构可以更快地判断子序列。的规模,我们需要优化存储方案,可能需要使用分布式存储系统来存储所有的。中的当前字符相等,如果相等,则两个指针同时前进;子序列是指在不改变剩余字符相对位置的情况下,通过删除。对于这个问题,我们可以采用双指针的方法来解决。进行预处理,建立一个字符到索引列表的映射,这样对于每个。的规模非常大,我们可以利用并行计算来加速处理过程。,我们可以缓存它们的结果,避免重复计算。的一个子序列,因为可以删除。中的位置,而不是每次都遍历。

weixin_73687229的博客 647

LeetCode 392——判断子序列

一、题目介绍 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 你可以认为 s 和 t 中仅包含英文小写字母。字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 <=100)。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。 ...

Asher 312

算法面试题《精选题目+题解分类汇总》

从去年年底开始想准备找实习,于是就开始懒散的复习。 大二学过数据结构,对基本的算法理论和数据结构有过了解,但是感觉又基本都交还给老师了 于是开始零散的复习,在leetcode上按照通过率由高到低开始刷,发现自己连通过率最高的几个题都吃力,几乎每个题都要去看题解然后慢慢消化 刷了十多个题就放弃了,这种盲目的玩法真的太伤自信心 于是就去看书,先复习下基础,当然就盲目看书还是没学到什么东西 之后又买了慕...

clonechen 2917

【刷题day06】力扣(LeetCode)每日一刷[21. 合并两个有序链表][206. 反转链表 ][392. 判断子序列]

刷题打卡第六天

ebb29bbe的博客 353

Leetcode 392.判断子序列

Leetcode 392.判断子序列 判断子序列 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 你可以认为 s 和 t 中仅包含英文小写字母。字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 <=100)。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。 示例 1: s = “abc”, t = “ahbgdc” 返回 true. 示

EIUC_Thread的博客 217
上一篇: java数据结构与算法刷题-----LeetCode605. 种花问题
下一篇: java数据结构与算法刷题-----LeetCode665. 非递减数列
ydenergy_殷志鹏
博客等级 码龄7年 5887粉丝 543原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ydenergy_殷志鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值