C++ 优先算法 —— 无重复字符的最长子串(滑动窗口)
目录
题目: 无重复字符的最长子串
1. 题目解析
2. 算法原理
Ⅰ. 暴力枚举
Ⅱ. 滑动窗口(同向双指针)
3. 代码实现
Ⅰ. 暴力枚举
Ⅱ. 滑动窗口
题目: 无重复字符的最长子串
1. 题目解析
题目截图:
此题所说的子串与长度最小的子数组题目中所说的子数组相当于一个概念,都是数组中连续的一段,区别在于子串是在一个字符串中,子数组是在一个整数数组中。
题目中要求找到一个没有重复字符的子串,并返回它的长度。
所以看到这里有三个长度为3的子串且是最长的,所以返回3。
这里可以看出全是b,只能找到一个字符,并返回长度1,因为再往后扩展也是重复的了。
所以,这道题的要求,并要求返回什么如上面所示。
2. 算法原理
这道题也有两种解法的:
- 暴力枚举
- 滑动窗口
Ⅰ. 暴力枚举
暴力枚举也就是把所有子串都枚举出来,枚举子串的时候,以某一个位置为起点,然后向后枚举,再接着以另一个某一个位置为起点,再向后枚举,这里注意的是枚举并不是全部枚举,而是当枚举一个位置时,继续再向后枚举的时候,如果发现有重复的字符出现,那么就停止枚举,也就是说,以这个位置开头的只能枚举到这里了,然后统计长度,接下来才是枚举第二个开头的,一直把所有情况枚举到,最后找一个长度的最大值。
这里的长度为2。
这里长度为3,通过上面题目解析中已经得知这里最长长度就是3.
固定每一个有可能的起始位置,然后依次向后扩展,直到扩展不能扩展为止,然后统计一下长度,把所有情况都枚举到,再统计一下最大值。
不过这里我们都是通过肉眼观察它们是否有重复的,但是程序中可不会直接就能观测到,这里就需要处理是否重复的细节问题了,可以借助开放定址法的hash表来解决重复问题,只需要把对应的字母映射到表上(遍历一个字符就让它映射到哈希表上),然后表里字母对应位置的数据统计它出现的次数,若是大于 1,那么它就重复。
所以这里的解法:暴力枚举+哈希表(表的数据存储的是字符出现的次数,为了判断字符是否重复出现)
这里时间复杂度:O(N²)。
所以,暴力枚举:
先判断 right 指向的字符在不在 hash表 里(也就是看表里对应的数据是不是大于 0),不在就放进去,然后 right 向后移动,再接着判断 right 指向的元素在不在,不在就放进去,right 再向后移动,重复上面的操作(不在就在表里对应的位置 +1,然后 right 后移)
再接着判断重复上面操作:
判断不在,重复上面操作:
此时判断不在,重复上面操作,这时right指向了第二个字符a:
当上面right 到 a 时,字符先前已经存在于哈希表里了,这时候就要停止枚举操作,"deabc"的长度就是以d开头的能得到无重复字符串的子串的最长长度。
接下来,让left换一个位置,left后移动一位,此时再让right回退至left的位置:
接下来继续重复上面的操作,直到把所有符合条件的情况枚举出来,统计长度,再获取最长的那个长度返回即可。
Ⅱ. 滑动窗口(同向双指针)
在上面暴力枚举种,我们发现有些情况是可以优化的,我们发现如下的情况:
这时left再往下一个移动的时候,这时到了字符a,让right回退到left,再继续枚举发现还是会到同一个a位置停止枚举,当left跳过了第一个出现的字符a之后,停止枚举的位置就发生变化了:
也就是说:
并且这里发现,在这个区间内依次往后枚举起始位置的话,因为终点是同样的,这时子串的长度就会递减,因此就可以让right不要拐回去了,让right在该位置先不动,先调整left,让left跳过有重复的字符:
暴力解法中,left移动到新的位置的时候,right就要回退至left的同位置,但这里也可以有个优化,也就是left跳过重复字符后,right是没有必要回退至left的:
因此,我们发现这里left和right的移动方向是一致的,也就是同向双指针:
这里的窗口就是left和right区间内维护的无重复字符的子串,让字符先进入窗口,然后判断,当有重复的字符的时候就让它出窗口:
这里的解法就是:利用规律,使用滑动窗口来解决问题。
注意:上面的情况每次都要更新结果,结果就是字符串的子串的长度。
规律:
- 当里面有重复的字符的时候,让left先向右移动,把出现的重复字符的位置之前的字符给跳过(因为它们的最后终点都会为这个重复的字符的第二次出现的位置)。
- 当left到符合要求的位置时候,right是不用回退的,可以继续向后移动,扩展该区间。
所以这里就可以同上一道题 长度最小的子数组 用滑动窗口的方法步骤解决:
- 先定义 left 和 right 并都初始化为0,充当窗口的左右端点。
- 进窗口(这里让字符串进入哈希表即可)。
- 判断:当窗口里有重复的字符时候,就要出窗口(就是从哈希表中删除该字符,注意:在删除之后,要再继续判断,直到没有重复字符为止)。
- 进出窗口都需要更新结果(符合要求的子串的长度,取新旧结果中最大的那一个即可)。
- 直到right指向最右边为止就就结束了。
这里时间复杂度情况也同于 长度最小的子数组 的情况,根据实际情况是每一步操作仅仅会让 right 向右移动 1 位或 left 向右移动 1 位,直到 right 移动到最后的位置。最坏的情况就是两个指针都遍历了一遍该数组,也就是2n次,所以时间复杂度为:O(N)。
接下来实现两种方法的代码:
3. 代码实现
题目链接:无重复字符的最长子串
Ⅰ. 暴力枚举
时间复杂度:O(N²)。
//暴力枚举
class Solution {
public:int lengthOfLongestSubstring(string s) {int n = s.size();int len = 0;for(int left = 0; left < n; left++) //先固定起始位置{int hash[128] = {0}; //将字符串中的字符出现次数映射到hash表for(int right = left; right < n; right++)//依次从left位置向后枚举扩展区间{hash[s[right]]++;//让字符充当下标,该位置字符出现,就让它对应的hash值+1if(hash[s[right]] > 1) //大于1说明出现重复字符了{break; //直接退出循环}len = max(len, right - left + 1); //更新结果}}return len;}
};
提交记录:
Ⅱ. 滑动窗口
时间复杂度:O(N)。
//滑动窗口
class Solution {
public:int lengthOfLongestSubstring(string s) {int n = s.size();int len = 0;int hash[128] = { 0 }; //使用数组模拟hash表//遇到重复的不需要让right回退了,让left跳过重复的字符之后,再处理right即可for(int left = 0, right = 0; right < n; right++) {hash[s[right]]++; //进入窗口while(hash[s[right]]>1) //判断{//大于1说明出现重复了hash[s[left++]]--; //出窗口}len = max(len,right-left+1); //更新结果 }return len;}
};
提交记录:
制作不易,若有不足之处或出问题的地方,请各位大佬多多指教 ,感谢大家的阅读支持!!!
相关文章:
C++ 优先算法 —— 无重复字符的最长子串(滑动窗口)
目录 题目: 无重复字符的最长子串 1. 题目解析 2. 算法原理 Ⅰ. 暴力枚举 Ⅱ. 滑动窗口(同向双指针) 3. 代码实现 Ⅰ. 暴力枚举 Ⅱ. 滑动窗口 题目: 无重复字符的最长子串 1. 题目解析 题目截图: 此题所说的…...
ADS学习笔记 6. 射频发射机设计
基于ADS2023 update2 更多ADS学习笔记:ADS学习笔记 1. 功率放大器设计ADS学习笔记 2. 低噪声放大器设计ADS学习笔记 3. 功分器设计ADS学习笔记 4. 微带分支定向耦合器设计ADS学习笔记 5. 微带天线设计 -1、射频发射机性能指标 在射频电路和系统中,发送…...
上海乐鑫科技一级代理商飞睿科技,ESP32-C61高性价比WiFi6芯片高性能、大容量
在当今快速发展的物联网市场中,无线连接技术的不断进步对智能设备的性能和能效提出了更高要求。为了满足这一需求,乐鑫科技推出了ESP32-C61——一款高性价比的Wi-Fi 6芯片,旨在为用户设备提供更出色的物联网性能,并满足智能设备连…...
QT QRadioButton控件 全面详解
本系列文章全面的介绍了QT中的57种控件的使用方法以及示例,包括 Button(PushButton、toolButton、radioButton、checkBox、commandLinkButton、buttonBox)、Layouts(verticalLayout、horizontalLayout、gridLayout、formLayout)、Spacers(verticalSpacer、horizontalSpacer)、…...
51单片机从入门到精通:理论与实践指南(一)
单片机在智能控制领域的应用已非常普遍,发展也很迅猛,学习和使用单片机的人员越来越多。虽然新型微控制器在不断推出,但51单片机价格低廉、易学易用、性能成熟,在家电和工业控制中有一定的应用,而且学好了51单片机&…...
零基础3分钟快速掌握 ——Linux【终端操作】及【常用指令】Ubuntu
1.为啥使用Linux做嵌入式开发 能广泛支持硬件 内核比较高效稳定 原码开放、软件丰富 能够完善网络通信与文件管理机制 优秀的开发工具 2.什么是Ubuntu 是一个以桌面应用为主的Linux的操作系统, 内核是Linux操作系统, 具有Ubuntu特色的可视…...
C#中面试的常见问题007
1.在EF中实现一个实体对应多个表 1. 表拆分(Table Splitting) 表拆分是指将一个实体映射到两个或多个表中的行。这通常发生在实体的属性分布在不同的表中,但这些表通过外键关联到同一个主表。在EF Core中,可以通过Fluent API来配…...
人工智能——大语言模型
5. 大语言模型 5.1. 语言模型历史 20世纪90年代以前的语言模型都是基于语法分析这种方法,效果一直不佳。到了20世纪90年代,采用统计学方法分析语言,取得了重大进展。但是在庞大而复杂的语言信息上,基于传统统计的因为计算量巨大…...
nodejs第三方库sharp对图片的操作生成新图片、压缩、添加文字水印及图片水印等
Sharp是一个基于libvips的高性能Node.js图像处理库,它提供了广泛的功能,包括调整大小、裁剪、旋转、格式转换等。Sharp可以处理多种图像格式,并且能够高效地转换图像格式。 相关说明及用法看:https://sharp.nodejs.cn/ 安装&#…...
力扣第 67 题 “二进制求和”
题目描述 给你两个二进制字符串 a 和 b,以二进制字符串的形式返回它们的和。 示例 1: 输入: a "11", b "1" 输出: "100"示例 2: 输入: a "1010", b "1011" 输出: "10101"提示: 每个字符串仅由…...
Spring Boot优雅读取配置信息 @EnableConfigurationProperties
很多时候我们需要将一些常用的配置信息比如oss等相关配置信息放到配置文件中。常用的有以下几种,相信大家比较熟悉: 1、Value(“${property}”) 读取比较简单的配置信息: 2、ConfigurationProperties(prefix “property”)读取配置信息并与 …...
鸿蒙多线程开发——Sendable对象的序列化与冻结操作
1、Sendable对象的序列化与反序列化 Sendable对象的简单介绍参考文章:鸿蒙多线程开发——线程间数据通信对象03(sendable) 与JSON对象的序列化和反序列化类似,Sendable对象的序列化和反序列化是通过ArkTs提供的ASON工具来完成。 与JSON类似࿰…...
nodepad配置c/c++ cmd快速打开创建项目文件
前提:下载MinGw,并且配置环境变量 点击阅读次篇文章配置MinGw 无论是哪个编译器,执行c文件都是经历以下步骤: 编译文件生成exe文件执行该exe文件 我们先手动完成这两部 手动编译文件使用指令 gcc {你的c文件} -o {生成文件名}生成exe文件 第二步运行exe直接点击该文…...
【C++】读取数量不定的输入数据
读取数量不定的输入数据 似乎是一个很实用的东西? 问题: 我们如何对用户输入的一组数(事先不知道具体有多少个数)求和? 这需要不断读取数据直至没有新的输入为止。(所以我们的代码就是这样设计的&#x…...
ESC字符背后的故事(27 <> 033 | x1B ?)
ANSI不可见字符转义,正确的理解让记忆和书写变得丝滑惬意。 (笔记模板由python脚本于2024年11月26日 15:05:33创建,本篇笔记适合python 基础扎实的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free…...
基于NXP LS1043 OpenWRT智能交通边缘网关设计
0 引言 城市公共交通是与人们生产生活息息相关的重 要基础设施,是关系国计民生的社会公益事业。“城 市公共交通发展的十三五规划”明确指出:建设与移 动互联网深度融合的智能公交系统;推进“互联网 城市公交”发展;推进多元…...
绪论相关题目
1.在数据结构中,从逻辑上可以把数据结构分成( C)。 A. 动态结构和静态结构 B. 紧凑结构和非紧凑结构 C. 线性结构和非线性结构 D. 内部结构和外部结构 2.在数据结构中,从存储结构上可以将之分为( B)。 A. 动态结构和静态结构 B. 顺序存储和非顺序存储 C. 紧凑结构和非紧…...
中国科学院大学研究生学术英语读写教程 Unit7 Materials Science TextA 原文和翻译
中国科学院大学研究生学术英语读写教程 Unit7 Materials Science TextA 原文和翻译 Why Is the Story of Materials Really the Story of Civilisation? 为什么材料的故事实际上就是文明的故事? Mark Miodownik 1 Everything is made of something. Take away co…...
centos系列安装服务器时分区
服务器安装手动分区,标准分区(注意顺序): 自定义标准分区 /boot/efi 200M;/boot 1G 放引导程序和内核文件及根文件; /var 磁盘1/10内存尽量大存放日志文件; /usr 磁盘1/10内存尽量大存在程序软件包; swap 虚…...
vue的理解
什么是vue vue是一套用于构建用户界面的渐进式框架,与其他框架不同的是,vue被设计为可以自底向上逐层应用,它也是创建单页面应用的web应用框架。vue的核心库只关注视图层,不仅易上手,还便于与第三方库或既有项目整合。…...
111. UE5 GAS RPG 实现角色技能和场景状态保存到存档
实现角色的技能存档保存和加载 首先,我们在LoadScreenSaveGame.h文件里,增加一个结构体,用于存储技能相关的所有信息 //存储技能的相关信息结构体 USTRUCT(BlueprintType) struct FSavedAbility {GENERATED_BODY()//需要存储的技能UPROPERT…...
抖音短视频矩阵源代码部署搭建流程
抖音短视频矩阵源代码部署搭建流程 1. 硬件准备 需确保具备一台性能足够的服务器或云主机。这些硬件设施应当拥有充足的计算和存储能力,以便支持抖音短视频矩阵系统的稳定运行。 2. 操作系统安装 在选定的服务器或云主机上安装适合的操作系统是关键步骤之一。推…...
leetcode - LRU缓存
什么是 LRU LRU (最近最少使用算法), 最早是在操作系统中接触到的, 它是一种内存数据淘汰策略, 常用于缓存系统的淘汰策略. LRU算法基于局部性原理, 即最近被访问的数据在未来被访问的概率更高, 因此应该保留最近被访问的数据. 最近最少使用的解释 LRU (最近最少使用算法), 中…...
计算机网络八股整理(一)
计算机网络八股文整理 一:网络模型 1:网络osi模型和tcp/ip模型分别介绍一下 osi模型是国际标准的网络模型,它由七层组成,从上到下分别是:应用层,表示层,会话层,传输层,…...
了解 CSS position 属性
CSS position 属性 在前端开发中,布局是一个至关重要的部分,而 CSS 的 position 属性是控制元素在页面中位置的核心工具。 本文将解释 CSS 中的 position 属性,包括其不同的值、效果及典型使用场景,以帮助你更好地理解和应用这一…...
数据结构 【二叉树(上)】
谈到二叉树,先来谈谈树的概念。 1、树的概念及结构 树是一种非线性的数据结构,它的逻辑关系看起来像是一棵倒着的树,也就是说它是根在上,而叶子在下的, 在树这种数据结构中,最顶端的结点称为根结点。在树的…...
C++11(中)
C11(中) 1.可变参数模板1.1.使用场景 2.lambda表达式(重要)2.1.使用说明2.2.函数对象与lambda表达式 3.线程库3.1.thread3.2.atomic原子库操作3.3.mutex3.3.1.mutex的种类3.3.2.lock_guard3.3.3.unique_lock 🌟&#x…...
下拉选择器,选择框,支持单选、多选、筛选和清空功能,支持vue2和vue3
下拉选择器,选择框,支持单选、多选、筛选和清空功能,支持vue2和vue3https://ext.dcloud.net.cn/plugin?id8159 点击即可。 注意数据来源: 选择的:valueName:选择下拉选择显示的显示屏...
HTTP中GET和POST的区别是什么?
HTTP定义: GET:用于获取资源,通常用于请求数据而不改变服务器的状态 POST:用于提交数据到服务器,通常会改变服务器的状态或产生副作用(如创建或更新资源) 参数传递方式: GET&…...
day04 企业级Linux安装及远程连接知识实践
1. 使用传统的网卡命名方式 在启动虚拟机时,按tab键进入编辑模式 添加命令: net.ifnames0 biosdevname0 这样linux系统会使用传统的网卡命名,例如eth0、eth1…… 2. 快照 做系统关键操作时,一定要使用快照(先将系统关机) 3.…...
区块链的网站怎么做/如何做网站营销
>> ∝-成正比符号,a∝b表示b与a成正比。 >> sinh与变量x一起表示双曲正弦,cosh与变量x一起表示双曲余弦。双曲正弦与双曲余弦总称双曲函数,单词hyperbolic称为双曲的。 >> ∀表示任意,any的首字母大写倒立&am…...
网站建设厂家/培训班管理系统 免费
项目管理题目连接: http://acm.hdu.edu.cn/showproblem.php?pid4858 Description 我们建造了一个大项目!这个项目有n个节点,用很多边连接起来,并且这个项目是连通的! 两个节点间可能有多条边,不过一条边的…...
wordpress淘宝联盟插件/免费seo推广公司
在GitHub上新建一个Repository: 新建仓库之后是这个界面(基本上已经清楚地告诉了我们该怎么做,按照步骤进行就可以): 在本地项目的根目录下打开控制台添加一个READEME文件:echo "# test" >&…...
做门户网站可以用的字体/品牌网站建设方案
被人工智能捧红的 Python 已是一种发展完善且非常多样化的语言,其中肯定有一些你尚未发现的功能。那么今天或许我能够让你学到一些新技巧。 Python的发展: “人生苦短,我用 Python”,Python 的经典 slogan 讲究争分夺秒&#x…...
财政局网站建设自查报告/国内新闻最近新闻今天
内部模块图与状态机图一、内部模块图二、状态机图一、内部模块图 二、状态机图 xmind和jpg格式文件下载链接 状态机图网址浏览链接,密码:56JC 内部模块图网址浏览链接,密码:ob35...
电子产品首页网站版模/做网站需要多少钱
产品三环 三环是指用户体验、企业需求和技术 用户体验:色彩感受 企业需求:需求池(常见四大需求来源:商业需求、干系人需求、过渡性需求、解决方案需求) 常见商业模式: 1.流量变现:下载收费、广…...