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

2024-06-08 1428阅读
  • 作者主页: 🔗进朱者赤的博客

    【经典算法】LeetCode 392 判断子序列(Java/C/Python3/Go实现含注释说明,Easy)
    (图片来源网络,侵删)
  • 精选专栏:🔗经典算法

  • 作者简介:阿里非典型程序员一枚 ,记录在大厂的打怪升级之路。 一起学习Java、大数据、数据结构算法(公众号同名)

  • ❤️觉得文章还不错的话欢迎大家点赞👍➕收藏⭐️➕评论,💬支持博主,记得点个大大的关注,持续更新🤞

    ————————————————

    目录

    • 题目描述
    • 思路及实现
      • 方式一:双指针法
        • 思路
        • 代码实现
          • Java版本
          • C语言版本
          • Python3版本
          • Golang版本
          • 复杂度分析
          • 复杂度分析
          • 相似题目
            • 标签(题目类型):双指针,字符串

              题目描述

              给定字符串 s 和 t,判断 s 是否为 t 的子序列。

              你可以认为,如果 s 可以通过将 t 中的一些字符(也可以不删除)而不改变其余字符的相对位置来获得,那么 s 就是 t 的一个子序列。

              原题:LeetCode 392

              思路及实现

              方式一:双指针法

              思路

              通过两个指针分别指向 s 和 t 的开头,然后逐个比较字符,如果相等则两个指针都向后移动一位,如果不等则只移动 t 的指针,直到 s 的指针指向末尾,则说明 s 是 t 的子序列。

              代码实现

              Java版本
              public boolean isSubsequence(String s, String t) {
                  int i = 0, j = 0;
                  while (i  
               
               

              说明:通过双指针 i 和 j 分别指向 s 和 t 的当前字符,并在满足条件时移动指针。

              C语言版本
              bool isSubsequence(char *s, char *t) {
                  int i = 0, j = 0;
                  while (s[i] && t[j]) {
                      if (s[i] == t[j]) {
                          i++;
                      }
                      j++;
                  }
                  return !s[i]; // 如果s的指针走到了末尾(即s[i]为'\0'),说明s是t的子序列
              }
              

              说明:C语言通过字符数组和指针实现与Java类似的逻辑。

              Python3版本
              def isSubsequence(s: str, t: str) -> bool:
                  i = j = 0
                  while i  
               
               

              说明:Python代码与Java和C语言类似,只是语法有所不同。

              Golang版本
              func isSubsequence(s string, t string) bool {
                  i, j := 0, 0
                  for i  
               
               

              说明:Golang的代码结构与其他语言类似,但语法和类型声明有所不同。

              复杂度分析

              • 时间复杂度:O(m + n),其中 m 和 n 分别是字符串 s 和 t 的长度。两个指针至多遍历两个字符串各一次。
              • 空间复杂度:O(1),只使用了常量级别的额外空间。

                复杂度分析

                • 时间复杂度:O(m + n),其中 m 和 n 分别是字符串 s 和 t 的长度。
                • 空间复杂度:O(k),其中 k 是字符串 t 中不同字符的数量。在最坏情况下,t 中的所有字符都不同,此时空间复杂度为 O(n)。
                  方式优点缺点时间复杂度空间复杂度
                  方式一逻辑简单清晰,只需遍历一次字符串无特别显著的缺点O(m + n)O(1)

                  相似题目

                  相似题目难度链接
                  leetcode 115. 不同的子序列困难力扣-115
                  leetcode 300. 最长递增子序列中等力扣-300
                  leetcode 53. 最大子序和简单力扣-53

                  在解决“判断子序列”这类问题时,双指针法是一种非常高效且直观的方法,它能够直接通过比较字符的相对位置关系来判断一个字符串是否是另一个字符串的子序列,而无需使用额外的数据结构或复杂的算法。因此,在实际应用中,我们可以优先考虑使用双指针法来解决类似的问题。

                  欢迎一键三连(关注+点赞+收藏),技术的路上一起加油!!!代码改变世界

                  • 关于我:阿里非典型程序员一枚 ,记录在大厂的打怪升级之路。 一起学习Java、大数据、数据结构算法(公众号同名),回复暗号,更能获取学习秘籍和书籍等

                  • —⬇️欢迎关注下面的公众号:进朱者赤,认识不一样的技术人。⬇️—

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]