news 2026/9/5 12:53:35

Leetcode 76.最小覆盖子串 JavaScript (Day 6)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Leetcode 76.最小覆盖子串 JavaScript (Day 6)

js一刷法一(丑陋)

varminWindow=function(s,t){if(s.length<t.length)return"";letm=newSet(s);for(leti=0;i<t.length;i++){if(!m.has(t[i]))return"";}letans=[0,1000000000000000000];letidx=newMap();for(leti=0;i<t.length;i++){idx.set(t[i],(idx.get(t[i])??0)+1);}letleft=0,right=0;while(right<s.length){if(idx.has(s[right]))idx.set(s[right],idx.get(s[right])-1);while([...idx.values()].every(x=>x<=0)){if(left===right)returns[right];if(right-left<ans[1]-ans[0])ans=[left,right];if(idx.has(s[left]))idx.set(s[left],idx.get(s[left])+1);left++;}right++;}while([...idx.values()].every(x=>x<=0)){if(left===right)returns[right];if(right-left<ans[1]-ans[0])ans=[left,right];if(idx.has(s[left]))idx.set(s[left],idx.get(s[left])+1);left++;}if(ans[1]==1000000000000000000)return"";returns.slice(ans[0],ans[1]+1);};

js一刷法一(优化版)

varminWindow=function(s,t){if(s.length<t.length)return"";letneed=t.length;letmap=newMap();for(letcoft){map.set(c,(map.get(c)??0)+1);}letleft=0;letans=[0,Infinity];for(letright=0;right<s.length;right++){letc=s[right];if(map.has(c)){if(map.get(c)>0)need--;map.set(c,map.get(c)-1);}while(need===0){if(right-left<ans[1]-ans[0]){ans=[left,right];}letd=s[left];if(map.has(d)){map.set(d,map.get(d)+1);if(map.get(d)>0)need++;}left++;}}returnans[1]===Infinity?"":s.slice(ans[0],ans[1]+1);};

思路完全相同,只不过一开始我是想用之前一个题思路,先将t存入hash,然后遇到符合条件的就-1,优化后用need(t的长度)来记录,need=0时候,说明找到了
算法核心:左指针不动,右指针不断往右,当窗口里包含了所有符合条件的字符后,从左边缩短窗口,左指针右移,所以说left在right动之前,永远指向的是有效字符,因为无效的在循环中清除了

js一刷法二(无敌)

varminWindow=function(s,t){constarr=newArray(128).fill(0);for(constioft){arr[i.charCodeAt(0)]--;}letleft=0,right=0,count=0,start=-1;letlen=s.length+1;while(right<s.length){if(arr[s.charCodeAt(right)]<0){count++;}arr[s.charCodeAt(right)]++;while(left<=right&&arr[s.charCodeAt(left)]>0){arr[s.charCodeAt(left)]--;left++;}if(count===t.length&&right-left+1<len){len=right-left+1;start=left;}right++;}returnstart===-1?"":s.slice(start,start+len);};

算法核心:长度可变的滑动窗口,因为字符串中数字大小写字母不方便来比较,所以全部转化成ASCII码来比较,创建一个长度为128的数组,对应0-127的ASCII码,可以表示26个大小写字母,0-9的数字
数组中

>0 无效元素
=0 符合要求,刚好在窗口内
<0 不在窗口内

先把数组全部初始化为0,要找的字符全部初始化为-1,然后向右遍历,并+1,原来为-1的加一后变为0,为在窗口内的有效字符,无用的字符和有用但重复的字符+1后>0,在后续的循环中可以被清除
用start记录起点 用len来更新长度,找到最小的len

语法注意点:
想要获取数组/字符串arr中的一部分,并且不破坏原数组,用slice(i,j),可以将arr[i]~arr[j-1]存储在新数组中并返回

arr.charCodeAt[i] 将arr[i]转化成ASCII码

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/3 7:08:51

【2026年精选毕业设计:基于本地大模型的个人数字健康管家系统(含论文+源码+PPT+开题报告+任务书+答辩讲解)】

2026年精选毕业设计&#xff1a;基于本地大模型的个人数字健康管家系统&#xff08;含论文源码PPT开题报告任务书答辩讲解&#xff09;告别云端依赖&#xff01;这个毕设项目让AI健康助手真正“住”进你的电脑——全程离线、隐私无忧、还能语音对话&#xff01;全套资料开源&am…

作者头像 李华
网站建设 2026/9/3 7:08:52

创业公司技术选型建议:PyTorch-CUDA-v2.7镜像提升研发效率

创业公司技术选型建议&#xff1a;PyTorch-CUDA-v2.7镜像提升研发效率 在AI创业浪潮中&#xff0c;一个现实问题反复浮现&#xff1a;新入职的算法工程师第一天上班&#xff0c;花了整整一天配置环境——CUDA驱动版本不匹配、cuDNN安装失败、PyTorch和Python版本冲突……最终模…

作者头像 李华
网站建设 2026/9/3 7:09:06

多GPU并行训练入门:PyTorch-CUDA-v2.7镜像支持多卡配置

多GPU并行训练入门&#xff1a;PyTorch-CUDA-v2.7镜像支持多卡配置 在深度学习模型日益庞大的今天&#xff0c;一个130亿参数的语言模型用单张RTX 4090跑完一轮训练可能需要两周时间——这显然无法满足快速迭代的研发节奏。更现实的情况是&#xff0c;研究者刚调好环境&#xf…

作者头像 李华
网站建设 2026/9/3 7:08:56

Anaconda下载慢?直接使用预装环境的PyTorch-CUDA-v2.7镜像

PyTorch-CUDA-v2.7镜像&#xff1a;告别Anaconda下载慢&#xff0c;开箱即用的深度学习环境 在深度学习项目启动的前几个小时&#xff0c;你是否也曾经历过这样的场景&#xff1a;满怀热情地打开电脑&#xff0c;准备复现一篇最新论文&#xff0c;结果卡在了 conda install py…

作者头像 李华
网站建设 2026/9/3 7:09:22

YOLOv11 mAP评估脚本:在PyTorch中计算检测精度

YOLOv11 mAP评估脚本&#xff1a;在PyTorch中计算检测精度 在目标检测领域&#xff0c;模型一旦训练完成&#xff0c;真正的考验才刚刚开始——我们如何客观地衡量它的表现&#xff1f;尤其是在YOLOv11这类追求速度与精度平衡的新一代架构下&#xff0c;一个可靠、高效的评估流…

作者头像 李华
网站建设 2026/9/4 2:17:47

轻量级深度学习环境:PyTorch-CUDA-v2.7仅需2分钟启动

轻量级深度学习环境&#xff1a;PyTorch-CUDA-v2.7仅需2分钟启动 在深度学习项目开发中&#xff0c;最让人头疼的往往不是模型调参&#xff0c;而是——“环境装不上”。 你有没有经历过这样的场景&#xff1f;刚拿到一块新GPU服务器&#xff0c;满心欢喜准备跑第一个训练任务&…

作者头像 李华