【LeetCode】392.判断子序列

文章目录

【题目链接】

392.判断子序列

【题目描述】

【解题思路】

本题采用 双指针法 是最优解,核心思路是通过两个指针分别遍历 s 和 t,逐步匹配 s 中的字符,利用 "子序列只需保持相对顺序" 的特性,高效判断匹配结果。

具体逻辑如下:

  • 初始化指针:定义两个指针 i 和 j,分别指向 s 的起始位置(i=0)和 t 的起始位置(j=0)。
    双指针遍历:
  • 同时遍历两个字符串,只要 i 未遍历完 s(i < s.size())且 j 未遍历完 t(j < t.size()),就持续循环。
  • 若当前 s[i] 与 t[j] 相等,说明匹配成功,将 i 向后移动一位(继续匹配 s 的下一个字符)。
    无论是否匹配成功,j 都需向后移动一位(继续遍历 t 的下一个字符,寻找可能匹配的字符)。
  • 判断结果:遍历结束后,若 i 等于 s 的长度(i == s.size()),说明 s 中所有字符都在 t 中按顺序匹配成功,返回 true;否则返回 false。

C++ 实现:

cpp 复制代码
class Solution {
public:
    bool isSubsequence(string s, string t) {
        int n = s.size();
        int m = t.size();

        int i=0; 
        int j=0;

        while(i<n && j<m){
            if (s[i] == t[j]){
                i++;
            }
            j++;
        }

        return i==n;
    }
};

Python实现:

python 复制代码
class Solution:
    def isSubsequence(self, s: str, t: str) -> bool:
        
        m = len(s)
        n = len(t)

        i = 0
        j = 0 

        while i<m and j<n:
            if s[i] == t[j]:
                i+=1

            j+=1

        return i==m 

时间复杂度:

  • 算法的时间复杂度描述的是最坏情况下的执行效率。对于本题:
  • 最坏情况是 s 不是 t 的子序列,且需要遍历完整个 t 才能确认(如上述例子),此时操作次数为 m。
    因此,时间复杂度由 t 的长度 m 主导,即 O (m),而非由 s 的长度 n 主导的 O (n)。

空间复杂度: O(1)

相关推荐
王老师青少年编程4 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【哈夫曼贪心】:合并果子
c++·算法·贪心·csp·信奥赛·哈夫曼贪心·合并果子
叼烟扛炮4 小时前
C++第二讲:类和对象(上)
数据结构·c++·算法·类和对象·struct·实例化
天疆说5 小时前
【哈密顿力学】深入解读航天器交会最优控制中的Hamilton函数
人工智能·算法·机器学习
wuweijianlove5 小时前
关于算法设计中的代价函数优化与约束求解的技术7
算法
小程故事多_805 小时前
[大模型面试系列] 多轮对话 Agent 设计实战(含窗口优化 + 工具调用精髓)
人工智能·面试·职场和发展
leoufung6 小时前
LeetCode 149: Max Points on a Line - 解题思路详解
算法·leetcode·职场和发展
样例过了就是过了6 小时前
LeetCode热题100 最长公共子序列
c++·算法·leetcode·动态规划
HXDGCL6 小时前
矩形环形导轨:自动化循环线的核心运动单元解析
运维·算法·自动化
谭欣辰6 小时前
C++ 排列组合完整指南
开发语言·c++·算法
代码中介商6 小时前
银行管理系统的业务血肉 —— 流程、状态机、输入校验与持久化(下篇)
c语言·算法