Leetcode 判断子序列

在这里插入图片描述

通过双指针来判断字符串s是否是字符串t的子序列。

算法思想:

  1. 双指针法

    • 我们使用两个指针ij分别遍历字符串st
    • 初始时,i指向s的第一个字符,j指向t的第一个字符。
  2. 匹配字符

    • 每次比较s[i]t[j]
      • 如果s[i] == t[j],说明s当前字符与t当前字符匹配,接下来可以继续匹配s的下一个字符,所以指针i右移。
      • 不论是否匹配成功,指针j都会右移,因为需要继续在t中查找。
  3. 判断结果

    • 循环结束后,我们检查i是否等于s的长度(i == s.length())。如果i等于s的长度,说明s的所有字符都能在t中按顺序找到,st的子序列,返回true。否则返回false

代码解读:

class Solution {public boolean isSubsequence(String s, String t) {int sLen = s.length(), tLen = t.length();  // 获取字符串 s 和 t 的长度int i = 0, j = 0;  // 初始化双指针,i 指向 s 的第一个字符,j 指向 t 的第一个字符// 当 i 小于 s 的长度 且 j 小于 t 的长度时进行遍历while (i < sLen && j < tLen) {if (s.charAt(i) == t.charAt(j)) {  // 如果 s[i] == t[j],则匹配,i 右移i++;}j++;  // j 每次都右移,遍历 t}// 如果 i == s 的长度,说明 s 的所有字符都按顺序匹配到了 t 中return i == sLen;}
}

复杂度分析:

  • 时间复杂度: O(n),其中 n 是字符串 t 的长度。因为我们只需遍历一次 t
  • 空间复杂度: O(1),只用了常量级别的额外空间来存储指针。

总结:这个算法通过双指针逐步在t中匹配s的字符,如果i能够遍历完s,则说明st的子序列。

为什么使用while循环而不是for循环?

在这个问题中,使用while循环而不是for循环的原因主要是因为我们需要两个指针(ij)来分别遍历两个不同的字符串(st),并且它们的移动并不是严格同步的。具体来说,ij 的移动取决于匹配条件,因此使用 while 循环更直观和灵活。

具体原因如下:

  1. 两个指针的独立性

    • ij 这两个指针的移动是独立的。只有当 s[i] == t[j] 时,i 才会移动,而 j 每次都要移动。因此,两个指针的移动节奏不一样,而 while 循环允许我们灵活地控制指针移动的逻辑。
    • 如果用 for 循环的话,通常是在一个固定范围内逐个递增,比较适合单个序列的遍历,而不太方便这种条件控制的多序列匹配。
  2. 终止条件的灵活性

    • while 循环的终止条件可以是两个字符串长度中的较大者。我们只要确保在 i < s.length()j < t.length() 的范围内操作即可。只要有一个条件不满足,就可以退出循环。这样的控制对于不同的字符串长度非常合适。
    • 如果用 for 循环,虽然也可以实现,但写法上会比较冗长,比如需要分别写两个嵌套的循环或者额外的判断条件,增加了代码的复杂度。
  3. 代码可读性

    • while 循环更自然地表达了“当两个字符串都没有遍历完时,继续匹配”的逻辑。它更加直观地反映了我们对字符匹配的意图,即逐个对比字符,遇到匹配的就移动 i,无论是否匹配都要移动 j,直到遍历结束。
    • for 循环一般用于每次都需要固定增加步数的场景,但在这里,我们不需要 ij 同时增加,这让 while 循环更容易理解。

for 循环的实现:

虽然使用 while 循环更加直观,但实际上也可以使用 for 循环实现类似逻辑。示例如下:

class Solution {public boolean isSubsequence(String s, String t) {int sLen = s.length();int j = 0;  // 只需要为 t 使用 for 循环,s 由条件控制for (int i = 0; i < t.length() && j < sLen; i++) {if (t.charAt(i) == s.charAt(j)) {j++;  // 如果匹配,移动 s 的指针 j}}return j == sLen;  // 判断是否 s 的所有字符都匹配}
}

总结:

  • while 循环 更加适合这个场景,因为它能够灵活控制两个指针的移动和终止条件,代码简洁易读。
  • for 循环 也可以实现相同的功能,但写起来相对不太直观,代码逻辑上可能会稍微复杂一些。

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

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

相关文章

大模型撬动数据新质生产力,我们重新解构了智能BI

大模型撬动数据新质生产力&#xff0c; 我们重新解构了智能BI 作者 | 曾响铃 文 | 响铃说&#xff08;xiangling0815&#xff09; “超级人工智能将在‘几千天内’降临。” 最近&#xff0c;OpenAI 公司 CEO 山姆奥特曼在社交媒体罕见发表长文&#xff0c;预言了这一点。之前…

web前端-----html5----用户注册

以改图为例 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>用户注册</title> </hea…

MySQL数据库增删改查基础操作(超长详解)

目录 1库的操作 显示数据库&#xff1a; 创建一个库 使用数据库 删除数据库的名 2表操作&#xff1a; 显示表 创建表 查看表 删除表名 新增 查出表的所有行和列&#xff1b; 实例&#xff1a; 别名&#xff1a; 去重&#xff1a; 排序&#xff1a; 限制查找的…

第五课 Vue中的显示隐藏指令

Vue中的显示与隐藏指令 v-show用于显示或隐藏DOM元素&#xff0c;配合布尔值表示显示状态&#xff0c;使用场景较多 基础示例&#xff1a; <style>.test{width: 100px;height: 100px;background: red;}</style><div id"app"><div class"…

01-gcc编译c++过程

GCC编译C的四个主要步骤 预处理&#xff08;Preprocessing&#xff09;编译&#xff08;Compilation&#xff09;汇编&#xff08;Assembly&#xff09;链接&#xff08;Linking&#xff09; 1. 预处理&#xff08;Preprocessing&#xff09; 作用&#xff1a;处理所有预处理…

IC验证面试中常问知识点总结(五)附带详细回答!!!

13、phase相关 13.1 phase列表及分类 task phase: 耗费仿真时间,如run phase;给DUT施加激励、监测DUT的输出都是在这些phase中完成的。 function phase:如build_phase、connect_phase等,这些phase都不耗费仿真时间。 13.2 为什么引入动态运行phase(12个小phase)? 为了…

JNA调用c++动态库返回数据

jna学习网站 JNA Examples 1、返回String, pch.h头文件 // pch.h: 这是预编译标头文件。 // 下方列出的文件仅编译一次&#xff0c;提高了将来生成的生成性能。 // 这还将影响 IntelliSense 性能&#xff0c;包括代码完成和许多代码浏览功能。 // 但是&#xff0c;如果此处…

Spring 中的 @AUtowire 和 @Resource 用法和原理,以及避坑

&#x1f31f; Why&#xff1a;了解 Autowire 和 Resource 的高级用法和原理对于开发大型企业级应用至关重要。这些注解不仅帮助我们实现组件之间的松耦合&#xff0c;还能提高代码的可维护性和可测试性。掌握它们的高级用法可以让我们更灵活地处理复杂的依赖关系。 &#x1f…

docker harbor

文章目录 一&#xff0c;搭建私有仓库1.1下载registry1.2在 daemon.json 中添加私有镜像仓库地址1.3重新加载重启docker1.4运行容器1.5拉取一个centos7镜像1.6给镜像加标签1.7上传镜像1.8显示私有仓库的所有镜像1.8查看私有仓库的 centos 镜像有哪些tag 二&#xff0c;什么是ho…

SVN——常见问题

基本操作 检出 提交 更新 显示日志 撤销本地修改 撤销已提交内容 恢复到指定版本 添加忽略 修改同一行 修改二进制文件

个人博客搭建 | Hexo框架

文章目录 1.Hexo安装2.创建博客3.将博客通过GitHub来部署4.更换主题 1.Hexo安装 Hexo 是一个快速、简洁且高效的博客框架。Hexo 使用 Markdown&#xff08;或其他标记语言&#xff09;解析文章&#xff0c;在几秒内&#xff0c;即可利用靓丽的主题生成静态网页。搭建Hexo首先要…

项目启动过程中,项目加载并初始化bean时报空指针

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name sysDictTypeServiceImpl: Invocation of init method failed; nested exception is java.lang.NullPointerException 其实对于调试开发项目中的bug很简单,我们要一针见血…

Flink作业骨架结构

前言 Flink 是大数据流计算引擎&#xff0c;开发者通过程序语言开发一个 Flink 作业&#xff0c;然后提交这个作业到服务端并执行&#xff0c;以完成对大数据流的处理。 Flink 作业有一个基本骨架&#xff0c;再复杂的 Flink 作业都离不开这个基本骨架&#xff0c;了解作业的…

spring boot itext7 修改生成文档的作者、制作者、标题,并且读取相关的信息。

1、官方的example文件&#xff1a;iText GitHub itext-java-7.2.5\kernel\src\test\java\com\itextpdf\kernel\pdf\PdfStampingTest.java 2、修改代码&#xff1a; Testpublic void stamping1() throws IOException {String filename1 destinationFolder "stamping1_…

期货考核系统部署/配资net源码

关于期货考核系统部署与配资NET源码的问题&#xff0c;以下是一些相关的信息和建议&#xff1a; 一、期货考核系统部署 期货考核系统的部署是一个复杂的过程&#xff0c;涉及需求分析、系统设计、开发、测试、部署等多个环节。以下是一些关键步骤&#xff1a; 需求分析&…

机器学习——主要分类

前言&#xff1a; 机器学习是人工智能的重要分支之一&#xff0c;它通过分析数据来构建模型&#xff0c;并通过这些模型进行预测、分类或决策。随着数据量的迅速增长&#xff0c;机器学习在多个领域展现出巨大的应用潜力&#xff0c;推动了科技的进步。根据学习方式和数据的使用…

Shell实现查看用户密码有效期

基于 Shell 脚本&#xff0c;实现显示 Linux 用户的密码修改时间、到期时间、到期天数和密码有效期等信息。 Shell 脚本&#xff1a; #!/bin/bash# 获取用户名 read -p "请输入要查询的用户名: " username# 检查用户是否存在 if id "$username" &>…

马化腾:“腾讯只剩半条命,另外半条交给合作伙伴”;服务号消息折叠折腾死生态伙伴另外半条命

马化腾曾坦言&#xff1a;“腾讯只剩半条命&#xff0c;另外半条交给合作伙伴。”这句话道出了腾讯赖以为生的生态布局&#xff0c;腾讯的成功不仅依靠自身强大的平台&#xff0c;还依赖着生态系统中的合作伙伴。而今&#xff0c;微信服务号“消息折叠”的推出&#xff0c;正是…

如何替换OCP节点(二):使用 antman脚本 | OceanBase应用实践

前言&#xff1a; OceanBase Cloud Platform&#xff08;简称OCP&#xff09;&#xff0c;是 OceanBase数据库的专属企业级数据库管理平台。 在实际生产环境中&#xff0c;OCP的安装通常是第一步&#xff0c;先搭建OCP平台&#xff0c;进而依赖OCP来创建、管理和监控我们的生…

前端_003_js扫盲

文章目录 var,let,const严格模式数据类型运算符事件常用对象函数绑定call() ,apply(),bind() 闭包浏览器中事件循环回调和异步Promiseasync和await DOMBOMAjax var,let,const let是var的升级版本&#xff0c;对于块作用域&#xff0c;var无法进行限制&#xff0c;let不会存在该…