当前位置: 首页 > news >正文

LeetCode 76 最小覆盖子串|JS 滑动窗口标准解法(逐行精讲)

大家好,这篇文章用来记录LeetCode 76 最小覆盖子串的 JS 标准解法,这道题是滑动窗口的经典必做题,面试频率极高。

我会直接给出可 AC 代码,并逐行详细解释,方便自己复习也分享给大家。

题目简介

给两个字符串st,找出s包含t所有字符的最短子串
如果没有,返回空字符串""


完整可提交代码

varminWindow=function(s,t){constneed={};constwindow={};letvalid=0;letleft=0,right=0;letstart=0,len=Infinity;// 统计 t 中每个字符需要的数量for(constcoft){need[c]=(need[c]||0)+1;}// 需要凑齐的字符种类数constneedSize=Object.keys(need).length;// 右指针遍历整个字符串while(right<s.length){constc=s[right];right++;// 如果当前字符是我们需要的if(need[c]){window[c]=(window[c]||0)+1;// 某一类字符数量达标,valid+1if(window[c]===need[c]){valid++;}}// 当窗口已经满足所有条件,开始收缩左侧while(valid===needSize){// 更新最小窗口if(right-left<len){start=left;len=right-left;}// 准备移除左指针字符constd=s[left];left++;// 如果是需要的字符,判断是否会破坏 validif(need[d]){if(window[d]===need[d]){valid--;}window[d]--;}}}// 没有找到返回空,否则返回截取的子串returnlen===Infinity?"":s.slice(start,start+len);};

逐行详细解析

1. 变量定义

constneed={};// 记录 t 中每个字符需要多少个constwindow={};// 记录当前窗口里每个字符有多少个letvalid=0;// 记录已经“数量达标”的字符种类数letleft=0,right=0;// 滑动窗口双指针letstart=0,len=Infinity;// 记录最终最短子串的起点和长度
  • need:我们要找的字符目标数量
  • window:当前窗口内的字符数量
  • valid核心判断条件,表示有多少种字符已经满足数量要求
  • left/right:窗口左、右边界
  • start/len:保存最优解,避免反复截取字符串

2. 统计目标字符

for(constcoft){need[c]=(need[c]||0)+1;}constneedSize=Object.keys(need).length;
  • 遍历t,统计每个字符需要多少个
  • needSize一共需要凑齐多少种字符

3. 右指针扩大窗口

while(right<s.length){constc=s[right];right++;if(need[c]){window[c]=(window[c]||0)+1;if(window[c]===need[c]){valid++;}}
  • 右指针一直往右走,扩大窗口
  • 遇到需要的字符,就加入window计数
  • 当某字符数量刚好达标时,valid += 1

4. 左指针收缩窗口(核心)

while(valid===needSize){// 更新最小窗口if(right-left<len){start=left;len=right-left;}constd=s[left];left++;if(need[d]){if(window[d]===need[d]){valid--;}window[d]--;}}
  • valid === needSize,说明当前窗口已经包含了 t 所有字符
  • 这时尽可能缩小窗口,寻找更短的子串
  • 每次移动左指针前:
    • 先更新最小窗口记录
    • 再把左边字符移出窗口
    • 如果移出后导致某字符不满足数量valid--,退出循环

5. 返回结果

returnlen===Infinity?"":s.slice(start,start+len);
  • 如果len还是无穷大,说明没找到,返回空串
  • 否则返回记录的最短子串

核心思想总结

这道题的核心就是滑动窗口 + 哈希计数

  1. 用右指针扩大窗口,直到满足条件
  2. 用左指针收缩窗口,直到不满足条件
  3. 全程记录最小窗口
  4. valid精准判断窗口是否合法

这套模板可以通杀绝大多数子串滑动窗口题,非常实用。


测试用例

console.log(minWindow("ADOBECODEBANC","ABC"));// "BANC"console.log(minWindow("a","a"));// "a"console.log(minWindow("a","aa"));// ""
http://www.rkmt.cn/news/1483579.html

相关文章:

  • 2026年磁粉探伤机多少钱?射阳探伤机厂价格亲民 - myqiye
  • 从零到精通:保姆级AI(Adobe Illustrator)2024新手入门避坑指南
  • 告别乱码!手把手教你用Qt Linguist搞定软件多语言切换(附完整代码)
  • 数据结构期末复习:第二章 线性表(选择题21道+判断题10道+程序填空3道)顺序表/链表/循环链表
  • CSDN AI数字营销客服体系深度拆解(2024官方协议+内部工单截图首曝)
  • 告别Swing丑界面!用FlatLaf给你的Java桌面应用换上IDEA同款皮肤(附Maven/Gradle配置)
  • 告别点不亮!手把手教你用STM32CubeMX配置SSD1306 OLED(I2C/SPI驱动详解)
  • 创建虚拟环境,并退出
  • 告别Swing默认丑界面:5分钟用FlatLaf给你的Java桌面应用换上IDEA同款皮肤
  • SAP WMS集成踩坑记:VL09 BDC + BAPI_OUTB_DELIVERY_CHANGE 搞定外向交货单冲销与批次拆分还原
  • 2026年阳光房门窗定制门店选购指南 - mypinpai
  • Nginx限流背后的算法与策略:漏桶、令牌桶怎么选?动态黑白名单用Lua+Redis如何实现?
  • LosslessCut:5分钟掌握无损视频剪辑,告别画质损失的终极解决方案
  • 《Python 入门到进阶完整学习笔记 | 基础语法 + 容器 + 函数 + 面向对象》
  • 2026年阻燃采光瓦选购指南,潍坊泰霖建材的优势 - mypinpai
  • 从航海图到手机地图:聊聊墨卡托投影如何统治了我们的数字世界
  • 别再只会用Assignee了!用Activiti7多实例搞定会签与或签的完整配置流程
  • 从输入法到语音识别:聊聊马尔可夫链在我们身边的那些“隐形”应用
  • Nginx黑白名单进阶玩法:告别手动配置,用Lua+Redis实现动态封禁恶意IP
  • 深度解析10款降AIGC工具:帮你锁定达标神器
  • 别再混淆了!一文讲清SAP WM里SU、HU和Quant的区别与联系(含配置点检查)
  • Gunicorn:Python WSGI HTTP 服务器
  • 好用的 GEO 优化线上推广品牌哪家强 - mypinpai
  • GPU显存稳定性测试终极指南:6分钟发现隐藏硬件故障
  • Foreman:服务器生命周期管理
  • SuperMap iDesktop实战:当CAD数据没有坐标系信息时,如何一步步完成投影转换?
  • 告别Electron?我用Flutter 3.0给Windows 11开发了个不到20MB的桌面应用
  • Randall-Sundrum膜世界中的虫洞与黑洞弦解
  • 2026年电话机器人选型指南:不同预算下的性价比推荐方案
  • Java Swing中JTable单元格添加可点击按钮的完整实现方案