# 二分查找高效判定子序列
给定字符 s 和 t , 判断 s 是否为 t 的子序列。
字符串的一个子序列是原始子字符串删除一些字符,而不改变剩余字符相对位置形成的新字符串。
例如:abc
是 abcde
的一个子序列。
# 思路:
- 使用双指针,两个指针分别扫描长传和短串,目标是为短串的字符在长串中匹配到,放回true,否则flase;
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
空指针方法:
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
拿s头挨个比:不知道什么方法,只是感觉代码很短,好记!
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
2
3
4
5
6
7
8
9
10