news 2026/4/15 18:26:04

LeetCode热题100:76. 最小覆盖子串

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode热题100:76. 最小覆盖子串

简介

题目链接:https://leetcode.cn/problems/minimum-window-substring/description/

解决方式:滑动窗口(双指针 + 数组)

这是作者学习众多大神的思路进行解题的步骤,很推荐大家解题的时候去看看题解里面大佬们的思路、想法!

推荐看灵茶山艾府大佬的讲解

滑动窗口(双数组)

classSolution{// 滑动窗口--双指针 + 数组// 双指针用来控制滑动窗口的大小和迭代元素// 数组用来存储特定的信息,作为双指针移动的依据publicStringminWindow(Strings,Stringt){// s 子串字符出现的次数int[]cntS=newint[128];// t 字符出现的次数int[]cntT=newint[128];// 遍历 t,将字符存进 cnt 方便后续对比for(inti=0;i<t.length();i++){cntT[t.charAt(i)]++;}// 初始化char[]str=s.toCharArray();intm=str.length;// 无效的初始状态intansLeft=-1;intansRight=m;// 最小覆盖子串的左右指针之所以这么设计,是为了方便后面没找到目标和首次找到目标时进行替换// 从头遍历 s,首先从 s 中找到涵盖 t 中字符的子串intleft=0;for(intright=0;right<m;right++){cntS[str[right]]++;// 如果找到了涵盖 t 字符的子串,那就进一步移动左指针找到最小的涵盖子串while(isCovered(cntS,cntT)){// 有两种情况// 第一种,刚从 s 中找到涵盖 t 的子串,需要进行赋值进而去找最小的子串// 由于之前 ansRight、ansLeft 的初始值(初始化长度)是无效的,即 m - (-1) = m + 1// 必定比找到的子串大,所以必然会重新赋值为最新的较小的子串// 第二种,已经找到了,但是在不断移动左指针找最小涵盖子串// 即当前子串为较小的子串,需要重新赋值if(right-left<ansRight-ansLeft){// 保存当前较小子串的位置,防止 left 移动丢之前的状态ansLeft=left;ansRight=right;}// 移动左指针,不断寻找是否有更小的子串cntS[str[left]]--;// 左端字母移出子串,防止涵盖判断出错left++;}}// 前面 ansLeft = -1 而不是 ansLeft = 0// 在此处就很好判断是否找到涵盖最小子串// 找到了就会被重新赋值不为 -1 没找到就不会重新赋值// 不会出现 0 是最小子串开头的索引还是标识没找到子串的二义性情况发生returnansLeft<0?"":s.substring(ansLeft,ansRight+1);}privatebooleanisCovered(int[]cntS,int[]cntT){for(inti='A';i<='Z';i++)if(cntS[i]<cntT[i])returnfalse;for(inti='a';i<='z';i++)if(cntS[i]<cntT[i])returnfalse;returntrue;}}

滑动窗口(单数组)

对判定涵盖的逻辑进行优化(less 变量)

classSolution{// 滑动窗口--双指针 + 数组// 对判定是否覆盖进行优化,使用一个数组 cnt 以 t 中的字符初始化// 新加 less 表示当前子串缺少的字符种类publicStringminWindow(StringS,Stringt){int[]cnt=newint[128];intless=0;for(charc:t.toCharArray()){// 刚开始数组中没有元素,先判断有没有 t 中的字符// 没有说明缺少该种字符需要计数// 后面即使有重复元素也不会进行重复计数if(cnt[c]==0){less++;}// 以 t 初始化数组cnt[c]++;}char[]s=S.toCharArray();intm=s.length;intansLeft=-1;intansRight=m;// 遍历 S 字符串,寻找最小涵盖子串intleft=0;for(intright=0;right<m;right++){// 移动子串右端点charc=s[right];// 右端点字母cnt[c]--;// 右端点字母移入子串if(cnt[c]==0){// 原来窗口内 c 的出现次数比 t 的少,现在一样多// 也就是说,当前子串不缺 t 种该种字符了less--;}// less 为零则表示当前子串涵盖 t 中所有字符了,需要移动左指针寻找最小子串// 寻找过程中不涵盖了就需要继续迭代 S 字符串中的剩下元素了// 以此来寻找最小的涵盖子串while(less==0){// 涵盖:所有字母的出现次数都是 >=if(right-left<ansRight-ansLeft){// 找到更短的子串ansLeft=left;// 记录此时的左右端点ansRight=right;}charx=s[left];// 左端点字母if(cnt[x]==0){// x 移出窗口之前,检查出现次数,// 如果窗口内 x 的出现次数和 t 一样,// 那么 x 移出窗口后,窗口内 x 的出现次数比 t 的少less++;}cnt[x]++;// 左端点字母移出子串left++;}}returnansLeft<0?"":S.substring(ansLeft,ansRight+1);}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/14 13:33:28

免费开源语音合成工具abogen:从文本到高质量有声书的终极指南

免费开源语音合成工具abogen&#xff1a;从文本到高质量有声书的终极指南 【免费下载链接】abogen Generate audiobooks from EPUBs, PDFs and text with synchronized captions. 项目地址: https://gitcode.com/GitHub_Trending/ab/abogen abogen是一款功能强大的开源语…

作者头像 李华
网站建设 2026/4/15 12:50:58

YashanDB数据库的关键优化参数与调优技巧

如何优化YashanDB数据库的查询速度和系统性能是推动业务高效运转的重要技术命题。数据库性能的优劣直接影响应用系统的响应时间及资源利用率&#xff0c;甚至关系到企业的运营效率和用户体验。YashanDB作为具备多形态部署和灵活架构的现代数据库系统&#xff0c;其性能优化涵盖…

作者头像 李华
网站建设 2026/4/10 23:33:45

KoNLPy终极指南:快速掌握韩语自然语言处理

KoNLPy终极指南&#xff1a;快速掌握韩语自然语言处理 【免费下载链接】konlpy Python package for Korean natural language processing. 项目地址: https://gitcode.com/gh_mirrors/ko/konlpy 想要轻松处理韩语文本数据吗&#xff1f;KoNLPy作为Python生态中最强大的韩…

作者头像 李华
网站建设 2026/4/15 3:10:24

青龙面板自动化脚本库:100+实用工具全面解析

在当今数字化时代&#xff0c;自动化已成为提升效率的关键。青龙面板作为最受欢迎的定时任务管理平台&#xff0c;结合QLScriptPublic脚本库&#xff0c;为用户提供了前所未有的自动化体验。这个开源项目汇集了100多个精心设计的脚本&#xff0c;覆盖了日常生活中的各种自动化需…

作者头像 李华
网站建设 2026/4/13 12:11:50

龙芯2K0300开发板:嵌入式开发的创新解决方案

在嵌入式开发领域&#xff0c;开发者经常面临硬件接口不足、扩展能力有限、调试过程繁琐的挑战。龙芯2K0300开发板系列通过创新的硬件设计和丰富的功能模块&#xff0c;为开发者提供了完善的解决方案。本文将从实际问题出发&#xff0c;深入解析这款开发板如何应对嵌入式开发中…

作者头像 李华
网站建设 2026/4/12 23:29:20

深度解析so-vits-svc配置参数:从问题诊断到性能调优的完整指南

当你面对so-vits-svc模型训练效果不理想时&#xff0c;是否曾感到无从下手&#xff1f;参数调整看似简单&#xff0c;实则暗藏玄机。本文将带你采用"问题诊断→解决方案→最佳实践"的三段式方法&#xff0c;系统掌握配置优化的核心技巧。 【免费下载链接】so-vits-sv…

作者头像 李华