# 二分查找高效判定子序列

给定字符 s 和 t , 判断 s 是否为 t 的子序列。

字符串的一个子序列是原始子字符串删除一些字符,而不改变剩余字符相对位置形成的新字符串。

例如:abcabcde 的一个子序列。

image-20210902103554422

# 思路:

  • 使用双指针,两个指针分别扫描长传和短串,目标是为短串的字符在长串中匹配到,放回true,否则flase;

image-20210902160323970

var isSubsequence = function(s, t) {
     // 切割字符串
     var shortArr = s.split('')
     var longArr = t.split('')
     // 双指针
     let i =0, j  = 0
     // 当两个指针还未遍历完
     while (i<longArr.length  && j < shortArr.length){
         // 如果双指针找到相同的值
         if(shortArr[j] == longArr[i]){
            j++
            i++
         }else{
            i++
         }
     }
    // 返回短指针长度
     return j == shortArr.length
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

空指针方法

image-20210902160058179

var isSubsequence = function(s, t) {
	// 定义空指针
    let index = 0;
    // 遍历短字符串
    for(let i = 0; i < s.length; i++){
        // indexOf(s[i]) 返回长字符串数组中给定元素的索引
        index = t.indexOf(s[i],index);
        // 如果index指针遍历结束,返回false
        if(index < 0) return false
        // 指针继续向前
        index ++
    }
    // 否则返回true
    return true;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

拿s头挨个比:不知道什么方法,只是感觉代码很短,好记!

image-20210902151236723

var isSubsequence = function(s, t) {
	for(let i = 0; i <= t.length; i++){
        // 如果长字符数组 等于 s[0],就删掉s[0]
        if(t[i] = s[0]) s = s.slice(1)
        // 如果s为空,直接返回true
        if(!s) return true
    }
    return false
}
// 作者 https://leetcode-cn.com/problems/is-subsequence/solution/na-stou-ai-ge-bi-by-shetia/
1
2
3
4
5
6
7
8
9
10
最后更新时间: 6/20/2022, 10:48:50 PM