「力扣392」 判断子序列

81 阅读1分钟

题目链接

判断子序列

思路

st 的每个字母依次比较,相同则继续比较下一组字母,不同则比较s当前字母t下个字母,即: 检查在相对顺序下,每个 s的字母 是否有一个 t的字母与之对应,如果是则 st 的子序列。

步骤

  1. 定义 2 个指针 c1,c2c1 指向 s 开头,c2 指向 t 开头。
  2. 如果 c1c2 指向的字母相同,则先移c1, 再移动c2。 如果 c1c2 指向的字母不同,则不动c1, 只移动c2
  3. 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;
}