持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第30天,点击查看活动详情
判断子序列
这是力扣第392题
给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。
解题思路
这是一道简单题。拿到这题,我们首先应该明确什么是子序列,题目里已经告诉我们了,子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。明确了这一点,我们就好确定解题思路了。接下来就来介绍一下关于这道题的解题思路。
暴力循环法
暴力法一直是我们解题当中的常客,碰到一般的题目都能使用它来解决,并且暴力法的思想也比较清晰易懂。对这题而言,暴力循环的解题思路就很简单了,用一层循环将其遍历,符合条件就继续,不符合条件就返回 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 题判断子序列 的解法和思路。这是我的一些做题记录,希望可以为正在刷题的你提供一些帮助。如有不足欢迎各位在评论区指正。