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- 找到字符串中所有字母异位词

给定两个字符串 sp,找到 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
};
相关推荐
超级码力6663 小时前
【Latex文件架构】Latex文件架构模板
算法·数学建模·信息可视化
穿条秋裤到处跑3 小时前
每日一道leetcode(2026.04.29):二维网格图中探测环
算法·leetcode·职场和发展
matlab_xiaowang3 小时前
Redux 入门:JavaScript 可预测状态管理库
开发语言·javascript·其他·ecmascript
Merlos_wind3 小时前
HashMap详解
算法·哈希算法·散列表
汉克老师4 小时前
GESP2025年3月认证C++五级( 第三部分编程题(1、平均分配))
c++·算法·贪心算法·排序·gesp5级·gesp五级
前端摸鱼匠5 小时前
Vue 3 的v-bind合并行为:讲解v-bind与普通属性合并的规则
前端·javascript·vue.js·前端框架·ecmascript
REDcker5 小时前
浏览器端Web程序性能分析与优化实战 DevTools指标与工程清单
开发语言·前端·javascript·vue·ecmascript·php·js
Yzzz-F6 小时前
Problem - 2205D - Codeforces
算法
智者知已应修善业7 小时前
【51单片机2个按键控制流水灯运行与暂停】2023-9-6
c++·经验分享·笔记·算法·51单片机
Halo_tjn7 小时前
Java Set集合相关知识点
java·开发语言·算法