LeetCode HOT 100 —— 76 .最小覆盖子串

news2024/12/24 8:26:50

题目

给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串"" 。

在这里插入图片描述

思路

**滑动窗口:**题目要求返回字符串s中包含字符串t的全部字符的最小窗口,即包含t的全部字符的窗口为可行窗口,所以可以用滑动窗口的思想解决这个问题

滑动窗口中的问题都会有两个指针,一个用于「延伸」现有窗口的r指针(相当于扩大右边界),和一个用于「收缩」窗口的 l 指针(相当于缩小左边界),在任意时刻,只有一个指针运动,而另一个保持静止

本题,在s上滑动窗口,通过指针r不断扩大窗口,当窗口包含t所需的全部字符后,如果能进行收缩,就进行收缩直到得到最小窗口,比如s="ABAACBAB",t="ABC",那么滑动窗口从s最开始滑动,只要窗口内没有包含'A','B','C',就r右移,直到窗口内包含'A','B','C'的时候,停止r指针;接着开始l右移缩小窗口,只要窗口内一直保持'A','B','C'就一直右移,直到不满足这个要求,停止l指针,开始r右移继续判断直到窗口内又重新包含'A','B','C'为止,循环下去…

对于判断当前窗口是否包含t所需的全部字符,可以用一个哈希表来表示t中所有的字符以及它们的个数,用一个哈希表动态维护窗口中的所有字符以及它们的个数,如果这个动态表中包含t的还白ode所有字符,并且对应个数都不小于t的哈希表中各个字符的个数,就说明当前的窗口是符合要求的

这里给出滑动窗口的算法框架(模板):

/*滑动窗口算法框架*/
void slidingWindow(String s, String t){
	Map<Character,Integer> need = new HashMap<>();//维护所需字符和出现次数
	Map<Character,Integer> window = new HashMap<>();//维护窗口中的字符和出现次数
	for(char c : t.toCharArray()){
		need.put(c,need.getOrDefault(c,0) + 1);
	}
	int left = 0. right = 0;
	int valid = 0;
	while(right < s.length()){
		// c 是将移入窗口的字符
		char c = s.charAt(right);
		// 右移窗口
		right++;
		// 进行窗口内数据的一系列更新
		...
		
		// 判断左侧窗口是否要收缩
		while(窗口需要收缩){//即判断窗口内字符是否满足要求
			// d 是将移出窗口的字符
			char d = s[left];
			// 左移窗口
			left++;
			// 进行窗口内数据的一系列更新
			...
		}
	}
}

根据这个模板,本题的代码如下:

class Solution {
    public String minWindow(String s, String t) {
        //1.维护两个map记录窗口中的符合条件的字符以及need的字符
        Map<Character,Integer> window = new HashMap<>();
        Map<Character,Integer> need = new HashMap<>();//need中存储的是需要的字符以及需要的对应的数量
        for(char c : t.toCharArray())
            need.put(c,need.getOrDefault(c,0)+1);
        int left = 0,right = 0;//双指针
        int count = 0;//count记录当前窗口中符合need要求的字符的数量,当count == need.size()时即可收缩窗口
        int start = 0;//start表示符合最小的子串的起始位序
        int len = Integer.MAX_VALUE;//len用来记录最终窗口的长度,并且以len作比较,淘汰选出最小的子串的len

        //一次遍历找“可行解”
        while(right < s.length()){
            //更新窗口
            char c = s.charAt(right);
            right++;//窗口扩大
            // window.put(c,window.getOrDefault(c,0)+1);其实并不需要将s中所有的都加入windowsmap,只需要将need中的加入即可
            if(need.containsKey(c)){
                window.put(c,window.getOrDefault(c,0)+1);
                if(need.get(c).equals(window.get(c))){
                    count++;
                }
            }
             //收缩左边界,找符合要求的最小解
            while(count == need.size()){//当窗口符合要求时
                if(right - left < len){//如果当前符合要求的窗口的长度比上一个最小窗口len还要小
                    len = right - left;//则更新len
                    start = left;
                }
                //更新窗口——这段代码逻辑几乎完全同上面的更新窗口
                char d = s.charAt(left);//移除最左边的元素
                left++;//窗口缩小
                if(need.containsKey(d)){//如果need中包含这个字符
                    if(need.get(d).equals(window.get(d))){//并且这个字符出现次数等于window中出现次数
                        count--;//则当前窗口中符合need要求的字符的数量减少1
                    }
                    window.put(d,window.get(d)-1);//更新当前窗口中d的字符次数
                    
                }
            }
        }
        return len == Integer.MAX_VALUE ? "" : s.substring(start,start+len);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/51245.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

世界杯的那些二三事

文章目录 &#x1f525;关于世界杯 &#x1f525;关于2022卡塔尔世界杯 &#x1f525;我与世界杯 ⚽分享一颗足球 ⚽实现效果 &#x1f525;关于世界杯 大力神杯 国际足联世界杯&#xff08;FIFA World Cup&#xff09;&#xff0c;简称“世界杯”&#xff0c;是由全世界…

【自然语言处理(NLP)】基于Bi-DAF的机器阅读理解

【自然语言处理&#xff08;NLP&#xff09;】基于Bi-DAF的机器阅读理解 作者简介&#xff1a;在校大学生一枚&#xff0c;华为云享专家&#xff0c;阿里云专家博主&#xff0c;腾云先锋&#xff08;TDP&#xff09;成员&#xff0c;云曦智划项目总负责人&#xff0c;全国高等学…

java+jsp基于ssm汽车配件管理系统-计算机毕业设计

项目介绍 本汽车配件管理系统是针对目前网上车企的实际需求&#xff0c;从实际工作出发&#xff0c;对过去的汽车配件管理系统存在的问题进行分析&#xff0c;结合计算机系统的结构、概念、模型、原理、方法&#xff0c;在计算机各种优势的情况下&#xff0c;采用目前最流行的…

利用Python生成随机密码,灰常简单,小伙伴可以试试哟

知识点 文件读写 基础语法 字符串处理 字符拼接 Python合集视频 【整整800集】Python爬虫项目零基础入门合集&#xff0c;细狗都学会了&#xff0c;你还不会&#xff1f;代码解析 导入模块 import platform import string import random将string的几大字符串拼接在一起&…

Spring Boot实现任意位置的properties及yml文件内容配置与获取

〇、参考资料 1、Spring Boot 中文乱码问题解决方案汇总 https://blog.51cto.com/u_15236724/5372824 2、spring boot读取自定义配置properties文件★ https://www.yisu.com/zixun/366877.html 3、spring boot通过配置工厂类&#xff0c;实现读取指定位置的yml文件★ https://b…

TensorFlow之文本分类算法-5

1 前言 2 收集数据 3 探索数据 4 选择模型 5 准备数据 6 模型-构建训练评估 构建输出层 构建n-gram模型 根据前面章节的描述&#xff0c;n-gram模型是独立地处理分词&#xff0c;与原文中的单词顺序不相关。简单的多层神经感知&#xff08;逻辑回归&#xff09;、梯度推…

SCP命令在不同远程服务器之间发送文件(指定端口)

最近想把数据集放在另一个服务器上&#xff0c;但是如果先下载到本地然后再上传过去&#xff0c;则需要浪费好久时间。 特总结下如何快捷的通过命令完成不同远程服务器之间的文件传输&#xff0c;以及遇到的问题。 SCP命令 Linux scp 命令用于 Linux 之间复制文件和目录。1 s…

第 46 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(上海),签到题6题

文章目录E.Strange IntegersD.Strange FractionsG.Edge GroupsI.Steadily Growing SteamH.Life is a GameK.Circle of Life补题链接&#xff1a;https://codeforces.com/gym/103446 E.Strange Integers E. Strange Integers time limit per test1 second memory limit per te…

搭建Docker+SRS服务器实现推流拉流的效果

最初的一个想法&#xff0c;是针对当前的网络电视去的&#xff0c;很多网络电视买回家&#xff0c;还要充很多会员&#xff0c;甚至跌入连环坑。我想给妈妈买一台电视&#xff0c;想把我自己收集的电影电视剧做成一个影视库&#xff0c;通过搭建家庭影院服务器&#xff0c;然后…

基于PHP+MySQL保险理赔系统的设计与实现

随着我国经济的发展,车辆的数量也在不断的增加相对应的车辆保险理赔的数量也在不断的增加,但是目前市面上很多理赔要么就是通过手工管理的方式进行管理,要么就是管理软件太过于的专业,为了能够让大众都能够在线通过网络进行在线理赔,我开发了本系统。 本设计尝试用PHP开发一个保…

SpringCloud_第3章_微服务保护_Sentinel

SpringCloud_第3章_微服务保护 文章目录SpringCloud_第3章_微服务保护1.初识Sentinel1.1.雪崩问题及解决方案1.1.1.雪崩问题1.1.2.超时处理1.1.3.仓壁模式1.1.4.断路器1.1.5.限流1.1.6.总结1.2.服务保护技术对比1.3.Sentinel介绍和安装1.3.1.初识Sentinel1.3.2.安装Sentinel1.4…

vue2.x和vue3.x 环境相关配置

1.vue2.x配置多个环境 在根目录下创建多环境配置文件 例如&#xff1a; env.devlopment、env.prod、env.sit等&#xff0c;我的环境文件有以下几个: 分别配置各文件的参数 比如说uat环境和生产环境请求url是不同的 uat环境env.uat: # uat环境 NODE_ENV uat# uat环境请求…

java锁

java锁 乐观锁和悲观锁 悲观锁 悲观锁认为自己在使用数据的时候一定有别的线程来修改数据&#xff0c;因此在获取数据的时候会先加锁&#xff0c;确保数据不会被别的线程修改。 悲观锁的实现方式 synchronized关键字Lock的实现类都是悲观锁 适合写操作多的场景&#xff0c;…

面向物联网应用的6G技术

摘要 在物联网(Internet of Things,IoT)快速发展和5G已经规模化的商业部署的背景下,在不久的将来,5G的技术指标将无法完全满足大规模IoT的应用需求。而6G技术由于其具备高传输、低时延等出色的性能指标,受到了学术界和工业界的广泛关注。因此,为了促使IoT网络能够更好地发…

此框架是SQL Server增量订阅,用来监听增删改数据库数据变更

目前仅支持SQL Server&#xff0c;后续会支持MySQL和Oracle&#xff0c;Nuget上可以下载安装 或者使用Nuget命令添加包 dotnet add package Kogel.Subscribe.Mssql --version 0.0.0.1 可以用来处理DB主从同步&#xff0c;跨库同步&#xff0c;数据备份&#xff0c;同步ES&…

AI绘画软件汇总

AI绘画软件汇总 AI绘图在线体验 二次元绘图 在线体验地址:Stable Diffusion 模型包括&#xff1a; NovelAI&#xff0c;NovelAI的模型训练使用了数千个网站的数十亿张图片&#xff0c;包括 Pixiv、Twitter、DeviantArt、Tumblr等网站的作品。 Waifu&#xff0c;waifu的模型…

ShareSDK for Unity

本文档使用Unity2019进行演示 下载unitypackage 从Mob的github地址下载ShareSDK.unitypackage&#xff1a;Git地址&#xff0c;如下图所示 )![image.png]//download.sdk.mob.com/2022/06/22/15/165588252810937.61.png) 下载完成后得到一个.unitypackage结尾的文件&#xf…

2022年12月全国DAMA-CDGA/CDGP数据治理认证招生简章

20DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职…

R语言stan进行基于贝叶斯推断的回归模型

可以从许多统计软件包中运行Stan。到目前为止&#xff0c;我一直在从R运行Stan。 我们围绕stan进行一些咨询&#xff0c;帮助客户解决独特的业务问题。 简单线性回归 第一步是为Stan模型编写文件。这包含一个文件linreg.stan&#xff1a; 视频&#xff1a;线性回归中的贝叶斯…

新闻舆情管理平台开发,监控舆情发展趋势

打造企业良好声誉可能需要几年、十几年甚至更久&#xff0c;而毁掉它只需要短短几分钟。尤其是互联网时代下&#xff0c;人们接收信息的速度越来越快&#xff0c;在新闻发出去的几分钟内就能迅速占据热搜榜。而且网络上每天都会产生上亿条信息&#xff0c;单纯的依靠人工进行监…