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

news2025/1/10 2:30:39

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 := 0
	res := s
	has := false
	for 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 = true
				if 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.coloradmin.cn/o/1321342.html

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

相关文章

电脑屏幕怎么调大小?分享4个实用操作!

“我最近在使用电脑时总感觉电脑屏幕看起来不太对劲&#xff0c;好像字体被刻意放大了&#xff0c;看起来很不舒服&#xff0c;想问问有什么方法可以解决这个问题吗&#xff1f;” 电脑屏幕的正常显示是我们使用电脑的重要前提之一。如果电脑屏幕设置或显示不正确&#xff0c;会…

微信Windows版-无效的WeChatWin.dll文件,错误码126

更新的微信Windows最新版本&#xff0c;突然有一天打开微信提示“无效的WeChatWin.dll文件 错误码 ErrorCode:126,点击“确定”下载最新版本”。 卸载重新安装跟到windows目录下替换WeChatWin.dll皆无效 该解决方案适用于Windows系统&#xff1a;Windows7、Windows10、Windows…

ModuleNotFoundError: No module named ‘openai.error‘

ModuleNotFoundError: No module named ‘openai.error’ result self.fn(*self.args, **self.kwargs) File “H:\chatGPTWeb\chatgpt-on-wechat\channel\chat_channel.py”, line 168, in _handle reply self._generate_reply(context) File “H:\chatGPTWeb\chatgpt-on-wec…

JavaOOP篇----第四篇

系列文章目录 文章目录 系列文章目录前言一、Char类型能不能转成int类型&#xff1f;能不能转化成string类型&#xff0c;能不能转成double类型二、什么是拆装箱&#xff1f;三、Java中的包装类都是那些&#xff1f; 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;…

数据安全传输基础设施平台(二)

5安全传输平台总体设计 5.1 方案特点 规范化&#xff1a;严格遵循各种相关规范设计。独立性&#xff1a;系统各子系统间互相独立&#xff0c;在保持系统间接口的前提下&#xff0c;各系统间的升级互不干扰。最小耦合性&#xff1a;各子系统进行严格功能分解&#xff0c;每个子…

基于云主机的k8s环境搭建

1. 申请三台云主机(按量付费即可) 内网IP配置节点角色172.17.0.92C4Gk8s-master172.17.0.82C2Gk8s-node1172.17.0.172C2Gk8s-node2 2. 安装Kubernetes集群(全部节点执行以下操作) 关闭防火墙 systemctl stop firewalld systemctl disable firewalld关闭selinux sed -i s/e…

Android Studio(3.6.2版本)安装 java2smali 插件,java2smali 插件的使用方法简述

一、Android Studio&#xff08;3.6.2版本&#xff09;安装 java2smali 插件 1、左上角File—>Setting&#xff0c;如下图 2、Setting界面中&#xff1a;点击Plugins—>选择右侧上方Marketplace—>搜索栏输入java2smali&#xff0c;如下图 3、点击Install按钮—>点…

L1-053:电子汪

题目描述 据说汪星人的智商能达到人类 4 岁儿童的水平&#xff0c;更有些聪明汪会做加法计算。比如你在地上放两堆小球&#xff0c;分别有 1 只球和 2 只球&#xff0c;聪明汪就会用“汪&#xff01;汪&#xff01;汪&#xff01;”表示 1 加 2 的结果是 3。 本题要求你为电子宠…

文件拷贝记录丨电脑文件操作拷贝记录监控

最近在我们后台看到了一则这样的咨询&#xff1a; 问我们是否可以查看员工一天做了什么&#xff0c;电脑上打开了什么文件&#xff0c;电脑上的文件操作记录有哪些 叮咚&#xff0c;当然&#xff0c;我们的软件可以实现啦。 具体的操作步骤&#xff0c;我这里演示一下↓ 1、…

基于Java SSM框架实现体育竞赛运动会成绩裁判管系统项目【项目源码+论文说明】

基于java的SSM框架实现体育竞赛运动会成绩裁判管系统演示 摘要 体育竞赛是各种体育体育项目比赛的总称。是在裁判员的主持下&#xff0c;按统一的规则要求&#xff0c;组织与实施的体育员个体或体育队之间的竞技较量&#xff0c;是竞技体育与社会发生关联&#xff0c;并作用于…

Linux中ll -h和du -h 查看的文件大小,同一个文件du -h的结果大很多

当使用 ll -h 和 du -h 查看同一个文件的大小时&#xff0c;可能会看到两者的结果不同&#xff0c;这是因为它们计算文件大小的方式有所不同。 ll -h 的结果&#xff1a; ll -h&#xff08;或其完整形式 ls -lh&#xff09;会显示文件的大小&#xff0c;但这个大小可能只是文件…

JS的浅拷贝和深拷贝

首先理解什么是浅拷贝和深拷贝&#xff1a; 浅拷贝&#xff1a; 浅拷贝只会复制对象的第一层属性&#xff0c;而不会递归地复制嵌套的对象。浅拷贝仅复制对象的引用&#xff0c;新对象和原始对象仍然共享相同的引用&#xff0c;因此对新对象的修改可能会影响到原始对象。浅拷…

聊聊如何实现热插拔AOP

前言 之前偶然看到一篇文章利用aop实现热拔插&#xff08;类似于插件&#xff09;&#xff0c;里面的实现挺好玩。今天我们也来玩一把 前置知识 Advice: org.aopalliance.aop.Advice “通知”&#xff0c;表示 Aspect 在特定的 Join point 采取的操作。包括 “around”, “b…

Elasticsearch 向量相似搜索

Elasticsearch 向量相似搜索的原理涉及使用密集向量(dense vector)来表示文档,并通过余弦相似性度量来计算文档之间的相似性。以下是 Elasticsearch 向量相似搜索的基本原理: 向量表示文档: 文档的文本内容经过嵌入模型(如BERT、Word2Vec等)处理,得到一个密集向量(den…

【git学习笔记 01】打标签学习

文章目录 一、声明二、对标签的基本认知什么是标签&#xff1f;为什么要打标签&#xff1f;如何生成类似github中readme的图标 三、标签相关命令四、示例操作 一、声明 本帖持续更新中如有纰漏&#xff0c;望批评指正&#xff01;参考视频链接&#xff0c;非常感谢原作者&…

物流运输小程序制作实战教程

随着互联网的发展&#xff0c;越来越多的企业开始涉足物流行业。在这个竞争激烈的市场中&#xff0c;拥有一个高效、便捷、可靠的小程序&#xff0c;可以帮助物流企业在同行业中脱颖而出。那么如何制作一个物流运输小程序呢&#xff1f;接下来&#xff0c;我们将通过实战教程&a…

【智慧之窗】AI驱动产品探索

一.初识 ChatGPT ChatGPT 是由 OpenAI 开发的自然语言处理&#xff08;NLP&#xff09;模型&#xff0c;基于 GPT&#xff08;Generative Pre-trained Transformer&#xff09;架构。GPT 系列的模型旨在理解和生成自然语言文本。ChatGPT 专注于支持对话性任务&#xff0c;即与…

【Go】基于GoFiber从零开始搭建一个GoWeb后台管理系统(四)用户管理、部门管理模块

第一篇&#xff1a;【Go】基于GoFiber从零开始搭建一个GoWeb后台管理系统&#xff08;一&#xff09;搭建项目 第二篇&#xff1a;【Go】基于GoFiber从零开始搭建一个GoWeb后台管理系统&#xff08;二&#xff09;日志输出中间件、校验token中间件、配置路由、基础工具函数。 …

向华为学习:基于BLM模型的战略规划研讨会实操的详细说明,含研讨表单(四)

2023年只剩下不到10天了&#xff0c;如何科学、系统地制定2024年的公司战略&#xff1f;如果您还没有找到好的方法&#xff0c;或者对过去的方法不是很满意&#xff0c;或者想探索习方法&#xff0c;不妨来看看华为和许多标杆企业在用的——基于BLM模型来组织战略规划。 前面三…

SpringBoot Whitelabel Error Page 报错--【已解决】

springboot 报错信息如下 这个报错页面就是个404 &#xff0c;代表你访问的url 没有对应的的requestmapping 其实没啥影响的一个问题&#xff0c;但是看到Error 就是不爽&#xff0c;改了他丫的 解决方法如下 一、调整application.properties配置【治标不治本】 server.err…