leetCode-热题100-滑动窗口合集(JavaScript)

滑动窗口

[1- 无重复字符的最长子串](#1- 无重复字符的最长子串)

[2- 找到字符串中所有字母异位词](#2- 找到字符串中所有字母异位词)

1- 无重复字符的最长子串

给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。

复制代码
var lengthOfLongestSubstring = function(s) {
    // 无重复字符的连续的最长子串
    // 滑动窗口:双指针+哈希表
    let window = new Map()// 记录窗口内字符的最新索引(避免重复)
    let left = 0
    let maxLen = 0
    for(let right = 0; right < s.length; right++){
        const char = s[right]
        // 如果当前字符已在窗口内(且索引≥left)
        if(window.has(char) && window.get(char) >= left){
            // 收缩左指针到「重复字符的下一位」
            left = window.get(char) + 1
        }
        // 更新当前字符的最新索引
        window.set(char,right)
        // 更新最大长度(当前窗口长度 = right - left + 1)
        maxLen = Math.max(maxLen,right-left+1)
    }
    return maxLen
};

2- 找到字符串中所有字母异位词

给定两个字符串 s 和 p,找到 s中所有 p的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。

复制代码
var findAnagrams = function(s, p) {
    // 和最小覆盖子串很像,但这个子串长度是固定的
    // 滑动窗口,双指针
    let ans = []
    let slen = s.length
    let plen = p.length
    let cnt = Array(128).fill(0)
    let less = 0
    // 如果s字符串比p字符串还短,直接返回ans
    if(slen < plen) return ans

    // 初始化p字符串对字符的需求
    // less表示p字符串的字符个数
    for(let char of p){
        const code = char.charCodeAt(0)
        if(cnt[code] === 0){
            less++
        }
        cnt[code]++
    }

    let left = 0
    for(let right = 0;right < slen; right++){
        // 
        const rCode = s.charCodeAt(right)
        cnt[rCode]--
        if(cnt[rCode] === 0){
            less--
        }
        // 固定滑动窗口大小为p字符串的长度
        // 窗口区间[left,right]
        if(right - left + 1 > plen){
            const lCode = s.charCodeAt(left)
            // 当前移除的字符是p字符串中需求的字符,需要将less-1
            if(cnt[lCode] === 0){
                less++
            }
            // 该字符需求+1
            cnt[lCode]++
            // 窗口右移
            left++
        }
        // 该窗口正好是p的异位词子串
        if(less === 0){
            ans.push(left)
        }
    }
    return ans
};
相关推荐
倒头就睡的小比特5 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!5 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
三十而立洋5 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
猎头南楼6 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
卡布鲁6 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
李少兄6 天前
JavaScript 隐式全局变量解析
javascript
旖旎夜光6 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark6 天前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her16 天前
并查集-听课笔记
笔记·算法·并查集
码流子6 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构