【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)

相关推荐
顾安r21 分钟前
11.15 脚本算法 加密网页
服务器·算法·flask·html·同态加密
前端小L37 分钟前
图论专题(四):DFS的“回溯”之舞——探寻「所有可能路径」
算法·深度优先·图论
司铭鸿40 分钟前
数学图论的艺术:解码最小公倍数图中的连通奥秘
运维·开发语言·算法·游戏·图论
元亓亓亓1 小时前
LeetCode热题100--39. 组合总和
算法·leetcode·职场和发展
2401_841495641 小时前
【LeetCode刷题】找到字符串中所有字母异位词
数据结构·python·算法·leetcode·数组·滑动窗口·找到字符串中所有字母异位词
橘颂TA1 小时前
【剑斩OFFER】算法的暴力美学——寻找数组的中心下标
算法·leetcode·职场和发展·结构与算法
py有趣1 小时前
LeetCode算法学习之鸡蛋掉落
学习·算法·leetcode
放羊郎1 小时前
机器人自主导航方案概述
人工智能·算法·机器人·slam·建图
冷徹 .2 小时前
Edu144 CD
c++·算法
一水鉴天2 小时前
整体设计 全面梳理复盘 之37 元级自动化引擎三体项目(Designer/Master/Transformer)划分确定 + 自用规划工具(增强版)
开发语言·算法·transformer·公共逻辑