Article / 文章

LeetCode 第392题:判断子序列

给定字符串 s 和 t,判断 s 是否为 t 的子序列。 子序列是指可以通过删除 t 中的某些字符(可以为0个),而不改变剩余字符的相对顺序得到的字符串。

📖 文章摘要

本文详细解析LeetCode第392题“判断子序列”,这是一道字符串子序列判定问题。文章提供了双指针和动态规划两种解题思路,包含C#、Python、C++三种语言实现,配有详细的表格分析和性能对比。适合初学者和面试准备者。

核心知识点: 双指针、动态规划、字符串遍历
难度等级: 简单
推荐人群: 字符串算法初学者、面试准备者

题目描述

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

子序列是指可以通过删除 t 中的某些字符(可以为0个),而不改变剩余字符的相对顺序得到的字符串。

示例

示例 1:

输入:s = “abc”, t = “ahbgdc” 输出:true

示例 2:

输入:s = “axc”, t = “ahbgdc” 输出:false

提示

  • 0 <= s.length <= 100
  • 0 <= t.length <= 10^4
  • s 和 t 仅由小写英文字母组成

解题思路

  • 方法名称:双指针法、动态规划法
  • 关键点:
    • 双指针分别遍历 s 和 t
    • 匹配到字符则移动 s 指针,否则移动 t 指针
    • 动态规划可处理多个 s 查询的场景
  • 具体步骤:
    1. 初始化两个指针 i, j 分别指向 s 和 t
    2. 遍历 t,若 t[j] == s[i],则 i++
    3. 最终判断 i 是否等于 s 的长度
  • 复杂度分析:O(n)

图解思路

算法步骤分析表

步骤 操作 状态 说明
初始状态 - i=0, j=0 指针初始化
遍历 比较字符 i, j 递增 匹配则 i++,否则 j++
检查 判断 i 是否到末尾 i==len(s) 是则为子序列

状态/情况分析表

情况 输入示例 输出 说明
是子序列 s=“abc”, t=“ahbgdc” true 顺序匹配成功
非子序列 s=“axc”, t=“ahbgdc” false x 不在 t 顺序中

代码实现

C# 实现

public class Solution {
    public bool IsSubsequence(string s, string t) {
        int i = 0, j = 0;
        while (i < s.Length && j < t.Length) {
            if (s[i] == t[j]) i++;
            j++;
        }
        return i == s.Length;
    }
}

Python 实现

class Solution:
    def isSubsequence(self, s: str, t: str) -> bool:
        i = j = 0
        while i < len(s) and j < len(t):
            if s[i] == t[j]:
                i += 1
            j += 1
        return i == len(s)

C++ 实现

class Solution {
public:
    bool isSubsequence(string s, string t) {
        int i = 0, j = 0;
        while (i < s.size() && j < t.size()) {
            if (s[i] == t[j]) i++;
            j++;
        }
        return i == s.size();
    }
};

执行结果

C# 实现

  • 执行用时:80 ms
  • 内存消耗:37 MB

Python 实现

  • 执行用时:40 ms
  • 内存消耗:14 MB

C++ 实现

  • 执行用时:4 ms
  • 内存消耗:6 MB

性能对比

语言 执行用时 内存消耗 特点
C# 80 ms 37 MB 代码简洁,易读
Python 40 ms 14 MB 语法简洁
C++ 4 ms 6 MB 性能最佳

代码亮点

  1. 🎯 双指针高效遍历
  2. 💡 动态规划适合批量查询
  3. 🔍 代码结构简洁明了
  4. 🎨 易于理解和维护

常见错误分析

  1. 🚫 指针越界
  2. 🚫 忽略空字符串情况
  3. 🚫 只判断部分字符
  4. 🚫 动态规划数组越界

解法对比

解法 时间复杂度 空间复杂度 优点 缺点
双指针 O(n) O(1) 简单高效 只适合单次
动态规划 O(n+m) O(nm) 批量高效 占用空间大

相关题目


📖 系列导航

🔥 算法专题合集 - 查看完整合集

📢 关注合集更新:点击上方合集链接,关注获取最新题解!目前已更新第392题。


💬 互动交流

感谢大家耐心阅读到这里!希望这篇题解能够帮助你更好地理解和掌握这道算法题。

如果这篇文章对你有帮助,请:

  • 👍 点个赞,让更多人看到这篇文章
  • 📁 收藏文章,方便后续查阅复习
  • 🔔 关注作者,获取更多高质量算法题解
  • 💭 评论区留言,分享你的解题思路或提出疑问

你的支持是我持续分享的动力!

💡 一起进步:算法学习路上不孤单,欢迎一起交流学习!