超时错误数组是另一个数组的子序列

问题描述

我在计算机的 IDE 中编写了这段代码,并通过了我能想到的所有测试用例。但是,在 AlgoExpert 和 LeetCode 上对其进行测试后,出现超时错误。我绞尽脑汁想找出我可能错过的任何测试用例,但似乎想不出任何测试用例。我还尝试在 AlgoExpert 中测试他们给我的所有测试用例。希望我没有遗漏任何明显的东西......任何人的提示将不胜感激!

给定 2 个非空整数数组,编写一个函数来确定第二个数组是否是第一个数组的子序列。请注意,数组中的单个数字或数组本身都是数组的有效子序列。

function isValidSubsequence(array,sequence) {
    if (sequence.length > array.length) return false;
    let s = 0;
    let a = 0;
    
    while (s < sequence.length){
        if (array[a] === sequence[s]){
            s++;
            a++
        }
        else a++;
        if (s !== sequence.length - 1 && a === array.length - 1) return false;
    }
    return true;
}

解决方法

如果序列失败,您的算法最后不会返回。

// running this will freeze your browser
function isValidSubsequence(array,sequence) {
    if (sequence.length > array.length) return false;
    let s = 0;
    let a = 0;
    
    while (s < sequence.length){
        if (array[a] === sequence[s]){
            s++;
            a++
        }
        else a++;
        if (s !== sequence.length - 1 && a === array.length - 1) return false;
    }
    return true;
}

console.log(isValidSubsequence([1,2,3],[5]));

对于您要执行的操作,您可能需要一个嵌套循环来检查序列是否匹配,从数组中的索引 开始(从 0 开始序列索引):>

function isValidSubsequence(array,sequence) {
    let s = 0;
    
    outer:
    while (s < array.length){
        for (let i = 0; i < sequence.length; i++) {
            if (array[s + i] !== sequence[i]){
                s++;
                continue outer;
            }
            return true;
        }
        s++;
    }
    return false;
}

console.log(isValidSubsequence([1,[5]));

但我认为 .includes 会更容易:

const isValidSubsequence = (array,sequence) => array.join().includes(sequence.join());

console.log(isValidSubsequence([1,[5]));
console.log(isValidSubsequence([1,[2,3]));