438. 找到字符串中所有字母异位词

滑动窗口

解题思路

  1. 初始化两个 hash 数组,用于记录 sp 中的字符;

  2. 滑动窗口的大小等于 p 的长度,每次向右滑动的时候判断两个 hash 数组是否内容相等,相等则说明存在 异位词 ,将滑动窗口的左边界索引放入结果数组中;

  3. 窗口滑动的过程中,要维护窗口内的元素个数;

复杂度

  1. 时间复杂度:O(N)

  2. 空间复杂度:O(1)

代码实现

function findAnagrams(s, p) {
    const result = [];
    if (s.length < p.length) return result;

    // 1. 初始化两个 hash 数组
    const sCount = new Array(26).fill(0);
    const pCount = new Array(26).fill(0);
    const offset = 'a'.charCodeAt(0); // 定义偏移量

    // 2. 初始化频率数组,保证了窗口的大小与 p 的长度一致
    for (let i = 0; i < p.length; i++) {
        pCount[p.charCodeAt(i) - offset]++;
        sCount[s.charCodeAt(i) - offset]++;
    }

    // 3. 滑动窗口
    for (let i = p.length; i <= s.length; i++) {
        // 窗口比较
        if (arraysAreEqual(pCount, sCount)) {
            result.push(i - p.length);
        }

        // 向右滑动窗口
        sCount[s.charCodeAt(i - p.length) - offset]--;
        sCount[s.charCodeAt(i) - offset]++;
    }

    return result;
}


// 辅助函数,用于比较两个数组是否相等
function arraysAreEqual(arr1, arr2) {
    for (let i = 0; i < 26; i++) {
        if (arr1[i] !== arr2[i]) return false;
    }
    return true;
}
打赏作者
您的打赏是我前进的动力
微信
支付宝
评论

中午好👏🏻,我是 ✍🏻   疯狂 codding 中...

粽子

这有关于前端开发的技术文档和你分享。

相信你可以在这里找到对你有用的知识和教程。

了解更多

目录

  1. 1. 滑动窗口
    1. 1.1. 解题思路
    2. 1.2. 复杂度
    3. 1.3. 代码实现