【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 分钟前
RLVR训练多模态文档解析模型-olmOCR 2技术方案(模型、数据和代码均开源)
人工智能·算法·ocr·grpo
凉虾皮23 分钟前
2024包河初中组
学习·算法·1024程序员节
m0_748233641 小时前
C++ 模板初阶:从函数重载到泛型编程的优雅过渡
java·c++·算法·1024程序员节
以己之1 小时前
11.盛最多水的容器
java·算法·双指针·1024程序员节
初级炼丹师(爱说实话版)2 小时前
算法面经常考题整理(3)大模型
算法
Neil今天也要学习2 小时前
永磁同步电机无速度算法--基于相位超前校正的LESO
算法·1024程序员节
码农多耕地呗3 小时前
力扣226.翻转二叉树(java)
算法·leetcode·职场和发展
235163 小时前
【MySQL】慢查寻的发现和解决优化(思维导图版)
java·后端·sql·mysql·职场和发展·数据库开发·数据库架构
IT古董4 小时前
【第五章:计算机视觉-项目实战之推荐/广告系统】2.粗排算法-(3)理解粗排模型之在线部分:在线架构及对双塔的应用
算法·1024程序员节
大数据张老师4 小时前
数据结构——平衡二叉树
数据结构·算法·查找