题目链接
思路
s 和 t 的每个字母依次比较,相同则继续比较下一组字母,不同则比较s当前字母和t下个字母,即: 检查在相对顺序下,每个 s的字母 是否有一个 t的字母与之对应,如果是则 s 是 t 的子序列。
步骤
- 定义
2个指针c1,c2,c1指向s开头,c2指向t开头。 - 如果
c1和c2指向的字母相同,则先移c1, 再移动c2。 如果c1和c2指向的字母不同,则不动c1, 只移动c2。 - 当
c1到达末尾时,说明s的字母以相对顺序存在于t中,返回true。 当c2到达末尾时,说明s中有些字母以相对顺序,在t中找不到,返回false。
复杂度
假设 s,t 中长的一个的长度是 N。
时间复杂度
时间复杂度由较长的那个字符串而定,所以是 O(N)。
额外空间复杂度
只用了有限几个变量,所以是 O(1)。
代码
TypeScript
function isSubsequence(s: string, t: string): boolean {
let c1 = 0;
let c2 = 0;
while (c1 < s.length && c2 < t.length) {
if (s[c1] === t[c2]) {
c1++;
c2++;
}
else {
c2++;
}
}
if (c1 === s.length) {
return true;
}
return false;
}