当前位置: 首页 > 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.jsqmd.com/news/971853/

相关文章:

  • Java Swing写的离线中文手写识别工具,带笔画分析和汉字字典
  • MixIO vs Blynk vs MQTT:为你的Arduino物联网项目选个轻量级平台
  • 从零到精通:保姆级AI(Adobe Illustrator)2024新手入门避坑指南
  • 告别乱码!手把手教你用Qt Linguist搞定软件多语言切换(附完整代码)
  • 数据结构期末复习:第二章 线性表(选择题21道+判断题10道+程序填空3道)顺序表/链表/循环链表
  • 别只刷题了!蓝桥杯备赛‘信息差’指南:如何利用B/C组身份和60%获奖率科学‘捡漏’
  • 不只是加TVS管:搞定8KV空气放电,我的PCB布局与屏蔽实战心得
  • 告别Swing丑界面!用FlatLaf给你的Java桌面应用换上IDEA同款皮肤(附Maven/Gradle配置)
  • 性价比高的碳纤维登山杖推荐,欣汇复合材料的产品如何 - myqiye
  • 告别纯理论:手把手教你用Pluto SDR搭建第一个无线模拟通信链路(MATLAB 2023版)
  • 别再让CRLF和LF打架了!一份给Java项目的跨平台Git协作避坑指南
  • Wasserstein距离在强化学习策略评估中的应用与优化
  • CSDN AI数字营销客服体系深度拆解(2024官方协议+内部工单截图首曝)
  • 哪款AI视频去重最靠谱?5款主流工具实测对比评测
  • 告别点不亮!手把手教你用STM32CubeMX配置SSD1306 OLED(I2C/SPI驱动详解)
  • IDEA里Git代码历史突然看不了?别慌,教你5分钟搞定这个烦人的换行符错误
  • 用Python的SymPy库验证极限公式:lim(x→0+) x^α (ln x)^β = 0 的代码实战
  • Nginx限流背后的算法与策略:漏桶、令牌桶怎么选?动态黑白名单用Lua+Redis如何实现?
  • 【经验】CSDN-AI数字营销试用测评3
  • 2026年阳光房门窗定制门店选购指南 - mypinpai
  • 深圳5家定制探店测评|RERA源木匠心,自有工厂品控排第一 - 产品测评官
  • 告别Swing默认丑界面:5分钟用FlatLaf给你的Java桌面应用换上IDEA同款皮肤
  • SAP WMS集成踩坑记:VL09 BDC + BAPI_OUTB_DELIVERY_CHANGE 搞定外向交货单冲销与批次拆分还原
  • 创建虚拟环境,并退出
  • 别再只会用Assignee了!用Activiti7多实例搞定会签与或签的完整配置流程
  • 信创环境避坑实录:在飞腾2000+银河麒麟V10上,我这样搞定了Docker 19.03.9和达梦8.1
  • 深圳装修对比3家实测,RERA源木匠心,5000平方工厂秒杀外包贴牌 - 产品测评官
  • 从航海图到手机地图:聊聊墨卡托投影如何统治了我们的数字世界
  • 实战避坑:从零到一开发你的第一个PDMS PML图形界面(Form)插件
  • 2026年阻燃采光瓦选购指南,潍坊泰霖建材的优势 - mypinpai