LeetCode 76 最小覆盖字串

LeetCode 76 最小覆盖字串

在本篇博客中,我们将探讨LeetCode上的一道算法题目——“最小覆盖子串”。这道题的主要目标是找到字符串s中包含字符串t中所有字符的最小子串。

问题描述

给定字符串s和t,要求在字符串s中找到一个最小的子串,使得这个子串包含了字符串t中所有的字符。如果不存在这样的子串,返回空字符串""。

解题思路

要解决这个问题,我们可以使用滑动窗口的方法。滑动窗口是一种经典的算法思想,在处理子串、子数组等问题时非常有效。

具体地,我们可以按照以下步骤进行:

  1. 创建两个哈希表,一个用于存储字符串t中每个字符的出现次数,另一个用于存储当前窗口中每个字符的出现次数。
  2. 使用两个指针,j指向窗口的左边界,i指向窗口的右边界 j和i初始化为0。
  3. 遍历字符串s,移动i。
  4. 缩小窗口,移动j,尽量减小窗口大小同时保证包含字符串t中所有字符。
  5. 在遍历过程中,更新最小子串的起始位置和长度。

实现代码

class Solution {
public:string minWindow(string s, string t) {unordered_map<char, int> map, _map;string result;// 将要查找的字符放入到哈希表中for (auto i : t) map[i]++;// j左 i右for (int i = 0, j = 0, count = 0; i < s.length(); i++) {// 如果_map中加入字符后数量没有超过map,说明是一个有效字符if (++_map[s[i]] <= map[s[i]]) count++;// 缩小窗口while (_map[s[j]] > map[s[j]]) _map[s[j++]]--;// 当窗口包含了t中所有字符时,更新最小子串if (count == t.length()) {if (result.empty() || result.size() > i - j + 1)result = s.substr(j, i - j + 1);}}return result;}
};

复杂度分析

时间复杂度分析

  • 遍历字符串s: 算法的主要部分是对字符串s进行一次线性遍历,因此时间复杂度为O(n),其中n是字符串s的长度。
  • 内部循环: 内部循环中包含了两个指针的移动,它们的时间复杂度取决于指针的移动次数。在最坏情况下,每个指针都可能移动n次,因此内部循环的时间复杂度也是O(n)。
  • 哈希表操作: 哈希表的操作在最坏情况下可以达到O(1)的时间复杂度,因此哈希表的操作不会对总体复杂度造成影响。

综上所述,算法的时间复杂度为O(n)。

空间复杂度分析

  • 哈希表的空间复杂度: 算法中使用了两个哈希表,它们存储的键值对数量不会超过字符串t的长度,因此哈希表的空间复杂度为O(|t|),其中|t|是字符串t的长度。
  • 额外空间: 除了哈希表之外,算法只使用了常数级别的额外空间,因此不会对总体空间复杂度造成影响。

综上所述,算法的空间复杂度为O(|t|)。

总结

本文介绍了如何利用滑动窗口的思想解决LeetCode中的"最小覆盖子串"问题。通过使用两个哈希表记录字符出现次数,以及通过移动左右指针来确定子串的位置,我们可以高效地找到问题的解决方案。滑动窗口是一种在处理子串问题时非常有用的算法思想,可以帮助我们解决各种相关的问题。

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

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

相关文章

5.36 BCC工具之ucalls.py解读

一,工具简介 ucalls工具总结了包括Java、Perl、PHP、Python、Ruby、Tcl和Linux系统调用在内的各种高级语言中的方法调用。它显示最常调用方法的统计信息,以及这些方法的延迟(持续时间)。 通过系统调用支持,ucalls可以提供关于进程与系统交互的基本信息,包括系统调用计数…

ES系列之Logstash实战入门

概述 作为ELK技术栈一员&#xff0c;Logstash用于将数据采集到ES&#xff0c;通过简单配置就能把各种外部数据采集到索引中进行保存&#xff0c;可提高数据采集的效率。 原理 数据源提供的数据进入Logstash的管道后需要经过3个阶段&#xff1a; input&#xff1a;负责抽取数…

C#单向链表实现:在当前节点后插入新数据的方法Insert()

目录 一、涉及到的知识点 1.插入算法 2.示例中current 和 _current 的作用 3.current 和 _current 能否合并为一个变量 4.单向链表节点类的三个属性 &#xff08;1&#xff09;Next属性&#xff1a; &#xff08;2&#xff09; Value属性&#xff1a; &#xff08;3&am…

【ArcPy】批量读取文件夹excel中XY并转为点shp

示例展示 代码 只读取excel中含有XY字段的文件&#xff0c;并将矢量命名为excel文件名称。 import os import pandas as pd import arcpy folder_path r"C:\Users\admin\Desktop\excelfile" extension"xlsx" files [file for file in os.listdir(folder…

SpringCloud gateway限流无效,redis版本低的问题

在使用springCloud gateway的限流功能的时候&#xff0c;配置RedisRateLimiter限流无效&#xff0c;后来发现是Redis版本过低导致的问题&#xff0c;实测 Redis版本为3.0.504时限流无效&#xff0c;改用7.0.x版本的Redis后限流生效。查了资料发现很多人都遇见过这个问题&#x…

RedisTemplate 序列化成功,反序列化失败List, Set, Map失败

RedisTemplate 序列化成功&#xff0c;反序列化失败List, Set, Map失败 异常信息RedisTemplate配置异常原因错误代码示例解决方法 序列化成功&#xff0c;反序列化失败 异常信息 Caused by: com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Could not resolve ty…

小程序事件处理

事件处理 一个应用仅仅只有界面展示是不够的&#xff0c;还需要和用户做交互&#xff0c;例如&#xff1a;响应用户的点击、获取用户输入的值等等&#xff0c;在小程序里边&#xff0c;我们就通过编写 JS 脚本文件来处理用户的操作 1. 事件绑定和事件对象 小程序中绑定事件与…

React之组件定义和事件处理

一、组件的分类 在react中&#xff0c;组件分为函数组件和class组件&#xff0c;也就是无状态组件和有状态组件。 * 更过时候我们应该区别使用无状态组件&#xff0c;因为如果有状态组件会触发生命周期所对应的一些函数 * 一旦触发他生命周期的函数&#xff0c;它就会影响当前项…

如何设置从小程序跳转到其它小程序

​有的商家有多个小程序&#xff0c;希望能够通过一个小程序链接到所有其它小程序&#xff0c;用户可以通过点击跳转链接实现从一个小程序跳转到另一个小程序。要怎么才能实现这样的跳转呢。下面具体介绍。 1. 设置跳转。在小程序管理员后台->分类管理&#xff0c;添加一个…

ssm个人学习01

Spring配置文件: spring环境的搭建: 1:导入对应的spring坐标 也就是依赖 2:编写controller, service, dao相关的代码 3:创建配置文件(在resource下面配置文件) 例如:applicationContext.xml <bean id "" class ""> <property name "&…

Node.js 中 fs 模块文件操作的应用教程

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;它可以让 JavaScript 代码在服务器端运行。在 Node.js 中&#xff0c;fs 模块是用来处理文件系统操作的模块。通过 fs 模块&#xff0c;我们可以进行文件的读取、写入、删除等操作。本教程将介绍如何在 No…

工作电压范围宽的国产音频限幅器D2761用于蓝牙音箱,输出噪声最大仅-90dBV

近年来随着相关技术的不断提升&#xff0c;音箱也逐渐从传统的音箱向智能音箱、无线音箱升级。同时在消费升级的背景下&#xff0c;智能音箱成为人们提升生活品质的方式之一。智能音箱是智能化和语音交互技术的产物&#xff0c;具有点歌、购物、控制智能家居设备等功能&#xf…

python水表识别图像识别深度学习 CNN

python水表识别&#xff0c;图像识别深度学习 CNN&#xff0c;Opencv,Keras 重点&#xff1a;项目和文档是本人近期原创所作&#xff01;程序可以将水表图片里面的数据进行深度学习&#xff0c;提取相关信息训练&#xff0c;lw1.3万字重复15%&#xff0c;可以直接上交那种&…

Vue中<style scoped lang=“scss“>的含义

这段代码中的<style scoped lang"scss">是HTML和Vue框架结合使用时常见的一个模式&#xff0c;具体含义如下&#xff1a; scoped&#xff1a;这是一个Vue.js特有的属性&#xff0c;用来指定样式只应用于当前组件的元素。没有这个属性时&#xff0c;样式会全局应…

python给企微发消息

方法一&#xff1a;webhook方式。使用群机器人给企微群发消息 import requestsdef qwxsendmessage(msg):urlhttps://qyapi.weixin.qq.com/cgi-bin/webhook/send?key6c598840-804a-4eb5-a999-a023313 #url换成自己群机器人的webhookurldata{msgtype:text,text:{content:msg}}…

elasticsearch7.17 terms聚合性能提升90%+

背景 ES7 相比于 ES6 有多个层面的优化&#xff0c;对于开源的ES而言&#xff0c;升级是必经之路。 ES的使用场景非常多&#xff0c;在升级过程中可能会遇到非预期的结果&#xff1b; 比如之前文章提到的典型案例&#xff1a;ES7.17版本terms查询性能问题 ES7.17版本terms查…

【Python笔记-FastAPI】后台任务+WebSocket监控进度

目录 一、代码示例 二、执行说明 (一) 调用任务执行接口 (二) 监控任务进度 实现功能&#xff1a; 注册后台任务&#xff08;如&#xff1a;邮件发送、文件处理等异步场景&#xff0c;不影响接口返回&#xff09;监控后台任务执行进度&#xff08;进度条功能&#xff09;支…

常见的几种httpclient

工作是spring 项目一般都是使用ResTemplate 但是还是有些项目中会用到httpClient&#xff0c;没有毛用。 <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> …

pclpy 点云法线

pclpy 点云法线 一、算法原理1.理论入门2.选择正确的比例 二、代码三、结果四、相关数据 一、算法原理 表面法线是几何表面的重要属性&#xff0c;在许多领域&#xff08;例如计算机图形应用程序&#xff09;中大量使用&#xff0c;以应用正确的光源来生成阴影和其他视觉效果。…

缓存穿透--一起学习吧之架构

缓存穿透是指查询一个一定不存在的数据&#xff0c;由于缓存是不命中时需要从数据库查询&#xff0c;查不到数据则不写入缓存&#xff0c;这将导致这个不存在的数据每次请求都要到数据库去查询&#xff0c;进而给数据库带来压力。在高并发场景下&#xff0c;如果某个key被高并发…