【每日LeetCode】手把手教你刷题之判断子序列

972 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第30天,点击查看活动详情

判断子序列

这是力扣第392题

给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。

image.png

解题思路

这是一道简单题。拿到这题,我们首先应该明确什么是子序列,题目里已经告诉我们了,子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。明确了这一点,我们就好确定解题思路了。接下来就来介绍一下关于这道题的解题思路。

暴力循环法

暴力法一直是我们解题当中的常客,碰到一般的题目都能使用它来解决,并且暴力法的思想也比较清晰易懂。对这题而言,暴力循环的解题思路就很简单了,用一层循环将其遍历,符合条件就继续,不符合条件就返回 false

相关代码如下:

var isSubsequence = function(s, t) {
    let l=0
    if(s===t) return true
    for(let i=0;i<t.length;i++){
        if(t[i]===s[l]){
            l++
        }
        if(l>=s.length) return true
    }
    return false
};

双指针法

双指针法太常用了,之前提到过能用双指针就能用暴力,反之亦然。用双指针解题的思路如下:

首先创建两个指针,其中慢指针指向 s 短的数组,快指针则指向 t 另一个数组。当快指针指向的元素等于慢指针指向的元素时,这时候慢指针就移动一格,如果最后慢指针没有指向数组的尾部,则最终返回 false,反之返回为 true

相关代码如下:

var isSubsequence = function(s, t) {
    let slow = 0,fast = 0;
    let len = t.length;
    while(fast<len){
        if(t[fast] === s[slow]){
            slow++;
            fast++;
            continue;
        }
        fast++;
    }
    if(slow<s.length){
        return false;
    }
    return true;
};

这两种方法都是十分常用的解题思路,希望大家一定要掌握。

总结

以上就是对 力扣 392 题判断子序列 的解法和思路。这是我的一些做题记录,希望可以为正在刷题的你提供一些帮助。如有不足欢迎各位在评论区指正。