leecode-LCR 017. 最小覆盖子串(golang版本)

leecode最小覆盖字串

leecode链接地址
给定两个字符串 s 和 t 。返回 s 中包含 t 的所有字符的最短子字符串。如果 s 中不存在符合条件的子字符串,则返回空字符串 “” 。

如果 s 中存在多个符合条件的子字符串,返回任意一个。

题解

func minWindow(s string, t string) string {
m := make(map[uint8]int)for i := 0; i < len(t); i++ {m[t[i]]++}valid := len(m)left := 0res := shas := falsefor right := 0; right < len(s); right++ {if v, ok := m[s[right]]; ok {m[s[right]]--if v == 1 {valid--}}if valid == 0 {for right-left >= len(t)-1 {has = trueif v, ok := m[s[left]]; ok {if v == 0 {if right-left < len(res) {res = s[left : right+1]}break}m[s[left]]++}left++}}}if !has {return ""}return res
}

核心点一: 滑动窗口

我们分析一下题目,需要判断s 中包含 t 的所有字符的最短子字符串,说明需要在字符串s中寻找一个连续的区间,这个区间包含的字符需要囊括的字符串t中的全部字符。一般这种寻找连续区间的题目,我们第一反应就应该是使用双指针的滑动窗口来处理

在这里插入图片描述
我们现在以s=ADOBECODEBANC,t=ABC为例,逐步分析滑动窗口的过程

区间范围是否包含字符串t
[0,0)
[0,1)
[0,2)
[0,4)
[0,5)
[0,6)

当前的滑动窗口包含的字符串是ADOBEC,这时已经完全包含字符串t的字符了。此时的滑动窗口指针分别是0,6,题目要求最短子字符串,这就意味着我们的工作还不能结束。相比于字符串t而言,此刻的滑动窗口内的字符数量远远大于t,这说明滑动窗口可能还有继续优化的空间。当右边的指针移动到完全包含字符串t时,左边的指针还有机会可以收缩窗口的空间。左边指针对应的字符是A,此刻滑动窗口内的字符A的数量为1,假如移动滑动窗口左边界,会使得窗口内不能完全包含t的字符,所以还是只能移动滑动窗口右边界。只有当滑动窗口内多加入一个A字符时,左侧边界就可以放弃A字符,却又不会影响整个滑动窗口能够包含t中的元素。

区间范围是否包含字符串t是否可以移动左边界
[0,7)
[0,8)
[0,9)
[0,10)
[0,11)
对于当前[0,11)包含的字符串,似乎不是最优的滑动窗口,因为左侧的A可以舍弃却不会影响最终的包含关系。
区间范围是否包含字符串t是否可以移动左边界
[1,11)
[2,11)
[3,11)
[4,11)
[5,11)
我们的滑动窗口还没有探索完毕整个字符串,我们再次移动右边界,探索滑动窗口的可能性。
区间范围是否包含字符串t是否可以移动左边界
[5,12)
[5,13)
[6,13)
[7,13)
[8,13)
[9,13)
此时,我们可以把上面所有包含t的时间窗口的字符串进行统计,找出最小的字符串,就是题解。

核心点二: 比较两个字串全排列是否相等

在这个题目中, 需要判断s 中包含 t 的所有字符的最短子字符串,可以首先思考一点,怎么比较两个字符串是相等的,也就是上面一个步骤中比较滑动窗口是否包含t。这里的相等不是一摸一样,而是包含相同的字符,如下所示的两个字符串就是一个全排列相等的字符串,因为他们包含了相同的字符:

字符串abcd: a 1个  b 1个 c 1个 d 1个
字符串dcba:  a 1个  b 1个 c 1个 d 1

我们来思考一下应该怎么写一个函数来判断这两个字符是否相等。我的第一想法是构建一个两个map结构的计数器,分别统计两个字符串的字符数量,计数器以字母为key值,以字母在字符串中的数量为value值,然后比较两个map是否一致。如果写出来大概是这么一段代码。

func equalString(a, b string) bool {ma := counnter(a)mb := counnter(b)return equalMap(ma,mb)}func counnter(s string)map[uint8]int{ma := make(map[uint8]int)for i := 0; i < len(s); i++ {ma[s[i]]++}return ma
}func equalMap(a,b map[uint8]int) bool{if a==nil||b==nil||len(a)!= len(b){return false}for k, v := range a {vv,ok:=b[k]if ok&&vv==v{continue}else {return false}}return true
}

有没有更简单的方案呢,很显然我们可以转换一下思路,我们来重新思考一下mb := counnter(b)。这个map也可以表示为:滑动窗口内还需要几个某种字符就可以完全涵盖字符串t中的字符了。
举个例子,

对于这么一个map,当前滑动窗口是[0,0),即窗口中没有任何字符:
a:1
b:2
c:3
我们可以这么理解,我们还需要1个a,2个b,3个c,才能完全涵盖字符串t
如果滑动窗口发生了变化[0,1),这时候我们在滑动窗口中新增了一个字符a,那么此时我们还需要个b,3个c,才能完全涵盖字符串t,但是这时我们可以发现,还需要2类有效字符的加入,对于滑动窗口而言是有效的。
假设map变成了a:-2
b:-3
c:1
此时,很显然只需要一类有效字符了,这时候我们在滑动窗口中新增了一个字符c,那么我们可以刻得到
a:-2
b:-3
c:0,很显然这个滑动窗口已经满足需求了。

综上所述,使用一个有效字段数量,和一个map就可以统计滑动窗口是否完全包含某一个字符串。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

未来医疗的新希望:人工智能与智能器官的奇妙融合

导言 人工智能技术的不断演进在医疗领域掀起了一场革命。随着智能器官与人工智能的深度融合&#xff0c;虽然医学领域迎来了前所未有的机遇&#xff0c;但同时也伴随着一系列潜在的问题与挑战。本文将深入探讨人工智能如何与智能器官相互融合&#xff0c;为医学带来新的治疗可能…

创建型模式之抽象工厂模式

一、概述 1、抽象工厂模式&#xff1a;提供一个创建一系列相关或相互依赖对象的接口&#xff0c;而无需指定它们具体的类。 2、抽象工厂模式&#xff1a;一个工厂可以生产一系列产品&#xff08;一族产品&#xff09;&#xff0c;极大减少了工厂类的数量 3、抽象工厂模式&am…

transformer 位置编码

目录 pytorch 实现位置编码 通俗易懂的&#xff1a; 从上面效果图可以看出&#xff0c;这个三角函数式位置编码满足以下四个特点&#xff1a; transformer 位置编码 transformer 位置编码通俗解释 绝对位置和相对位置 pytorch 实现位置编码 转自&#xff1a;https://www…

分类预测 | Matlab实现AOA-SVM算术优化支持向量机的数据分类预测【23年新算法】

分类预测 | Matlab实现AOA-SVM算术优化支持向量机的数据分类预测【23年新算法】 目录 分类预测 | Matlab实现AOA-SVM算术优化支持向量机的数据分类预测【23年新算法】分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现AOA-SVM算术优化支持向量机的数据分类预测…

坦克大战(二)

欢迎来到程序小院 坦克大战&#xff08;二&#xff09; 玩法&#xff1a;键盘&#xff08;A W S D&#xff09;键来控制方向,空格键发射子弹&#xff0c;N&#xff1a;下一关&#xff0c;P&#xff1a;上一关&#xff0c;Enter&#xff1a;开始&#xff0c;赶紧去闯关吧^^。开…

主馆位置即将售罄“2024北京国际信息通信展会”众多知名企聚京城

2024北京国际信息通信展&#xff0c;将于2024年9月份在北京国家会议中心盛大召开。作为全球信息通信技术领域的重要盛会&#xff0c;此次展会将汇集业内顶尖企业&#xff0c;展示最新的技术成果和产品。 目前&#xff0c;主馆位置即将售罄&#xff0c;华为、浪潮、中国移动、通…

使用小程序实现App灰度测试的好处

灰度测试&#xff08;Gray Testing&#xff09;是一种软件测试策略&#xff0c;也被称为渐进性测试或部分上线测试。在灰度测试中&#xff0c;新的软件版本或功能并非一次性推送给所有用户&#xff0c;而是仅在一小部分用户中进行测试。这可以帮助开发团队逐步暴露新功能或版本…

react-native利用百度地图SDK实现管道的采集

一、效果图 二、具体实现步骤 1、安装react-native-baidu-map npm install react-native-baidu-map 2、查看百度地图sdk的文档 通过参数配置&#xff0c;可选择定位模式、可设定返回经纬度坐标类型、可设定是单次定位还是连续定位 主要配置 option.setLocationMode(Location…

隐私计算介绍

这里只对隐私计算做一些概念性的浅显介绍&#xff0c;作为入门了解即可 目录 隐私计算概述隐私计算概念隐私计算背景国外各个国家和地区纷纷出台了围绕数据使用和保护的公共政策国内近年来也出台了数据安全、隐私和使用相关的政策法规 隐私计算技术发展 隐私计算技术安全多方计…

Web前端-CSS(文本样式)

文章目录 1.font字体1.1 font-size:大小1.2 font-family:字体1.3 font-weight:字体粗细1.4 font-style:字体风格1.5 font总结 2. css外观属性2.1 color:文本颜色2.2 text-align:文本水平对齐方式2.3 line-height:行间距2.4 text-indent:首行缩进2.5 text-decoration 文本的装饰…

协同物联:设备物联与车间数据采集的融合

随着工业4.0和智能制造的快速发展&#xff0c;物联网技术在工业领域的应用逐渐普及。其中&#xff0c;协同物联、设备物联和车间数据采集技术对于提升企业生产效率和降低运营成本具有重要意义。本文将深入探讨这些技术在现代工业环境中的应用及它们如何共同推动企业向数字化转型…

c语言:输出26个英文字母|练习题

一、题目 分两排&#xff0c;输出26个英文字母 如图&#xff1a; 二、思路分析 1、从第13个字母分行显示 2、从A开始&#xff0c;在A的ASC码后面&#xff0c;按顺序加1~26 三、代码图片【带注释】 四、源代码【带注释】 #include <stdio.h> //题目:输入26个字母&#x…