HOT100--(3)无重复字符的最长子串

news/2024/4/29 13:28:37/文章来源:https://blog.csdn.net/weixin_52669146/article/details/129279591

点击查看题目详情

  • 大思路:

创建哈希表,元素类型为<char, int>,分别是字符与其对应下标

用哈希表来存储未重复的子串,若有重复则记录下当前子串最大值maxhashsize
并且开始以相同方法记录下一子串
遍历完成以后,哈希表里记录的maxhashsize,也就是题目所需

如果没重复就一直遍历
当遇到了重复值,就进行新子串的长度计算

  • 细节处

hashsize代表当前子串长度,start代表哈希表非重复子串的起点,i是遍历下标

值得注意的一点是,由于这种方法不像官解需要删除哈希表内容
所以当遇到重复的字符时,只需将下标与哈希表内重复字符的下标替换之
并且此时开始计算新子串的长度

例如a(0) b c a(3) b c d:()内代表对应下标

遍历到a(3)时,此时哈希表内已有:a(0) b c
需要进行的操作是将a(3)存入哈希表,其实就是将其下标存入,得到:a(3) b c

  • 避免重复遍历/新字串的长度如何算

为了避免重复比较,走完a(0) b c以后,遇到重复值a(3)可以直接将子串的初始值赋值为a(0)-a(3)之间的字符个数;这样b c a(3)就不会重复比较了。因为a(0)-a(3)之间肯定没有重复的值,所以直接将其长度记录下来即可,就相当于跳过了这一段的遍历。

然后此时的的长度就是新子串的初始值,比如上例的b开始遇到第二个b的时候,其长度为3,那其实按照刚才的方法来说,就是下标:b(1)-b(4) = 3;如果没有遇到重复值,就在这个初始值的基础上一直++即可。

要实现这一点,要保证起点start与字符内存的value下标要正确

例如遍历完a2后,哈希表里面存的就是a(3) b(1) c(2),而不是a(0) b(1) c(2)
后续再碰到a的时候,就用当前i减去start就是新子串长度

因为上述表达式应该解释为:hashsize = i - start;

  • 两个情况计算start

再要注意的一点,并不是每次的start都是哈希表存的重复值的下标
比如上例的a重复,其下标0就是start。或者b重复,其下标就是1就是start;这种是从某个字符(a(0))开始,到该字符结束(a(3))

而这种情况:a b c a d e(5) f e(7) ---- 从某个字符(b)开始,到另一字符(e(7))结束
当遍历到e(7)的时候,start是b的下标1
但是此时的e(5)下标是5,那此时的新字串(e(5)至f)的长度,总不能是e(7)-b(1)吧?
所以此时新字符串的初始值应该是e(7)-e(5)

那么根据上述两种情况,可知start的坐标是需要比较出来的:start = max(hashtable[s[i]],start)
在本例中,这里的hashtable[s[i]]就是e(5),star就是b(1)
也就是说判断e(5)的下标和此时的start谁大
更新了start后,新字符串的初始值为hashsize = i - start
这里的i其实就是e2的下标,那么上式也就是e2-e1

class Solution {
public:int lengthOfLongestSubstring(string s) {unordered_map<char,int> hashtable;int hashsize = 0;//哈希表的长度int start = 0;//哈希当前的起点,用于计算子串长度int maxhashsize = 0;//哈希表最长长度for(int i = 0;i < s.size();i++){if(hashtable.find(s[i]) == hashtable.end()){//未找到重复值//将其存入哈希表hashsize++;hashtable[s[i]] = i;}else{//找到重复值,说明已经开始遍历下一个子串//1.比较新旧哈希表的长度,得出maxhashsize//2.更新哈希表的起点start//3.更新hashsize为下一个字串的长度//4.更新哈希表里重复值的下标maxhashsize = hashsize>maxhashsize?hashsize:maxhashsize;start = max(hashtable[s[i]],start);hashsize = i - start;hashtable[s[i]] = i;}}//一条路走到黑的情况maxhashsize = hashsize>maxhashsize?hashsize:maxhashsize;return maxhashsize;}
};

运行结果:

在这里插入图片描述

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

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

相关文章

【项目精选】进销存管理系统的设计与实现(视频+源码+论文)

点击下载源码 1.1研究背景和意义 目前&#xff0c;许多的中小企业普遍存在一个问题&#xff1a;企业的决策者看到的进销存资料及相关报表都是比较繁杂&#xff0c;让本应该一目了然的结果因信息的分散使得产生的结果无法保持一致和完整&#xff0c;造成企业在进销存管理上问题很…

T3 出行云原生容器化平台实践

作者&#xff1a;林勇&#xff0c;就职于南京领行科技股份有限公司&#xff0c;担任云原生负责人&#xff0c;也是公司容器化项目的负责人。主要负责 T3 出行云原生生态相关的所有工作&#xff0c;如服务容器化、多 Kubernetes 集群建设、应用混部、降本增效、云原生可观测性基…

有趣的 Kotlin 0x10:操作符 ..<

操作符 …< ..< 操作符是 Kotlin 在 1.7.20 版本中引入的不包含尾部元素的左闭右开区间操作符。之前我们使用的比较多的操作符可能是 .. 和 until&#xff0c;两者均表示区间&#xff0c;前者是闭区间&#xff0c;后者则表示不包含末端元素的左闭右开区间。 OptIn(Expe…

【微服务】Ribbon实现负载均衡

目录 1.什么是负载均衡 2.自定义负载均衡 3.基于Ribbon实现负载均衡 Ribbon⽀持的负载均衡策略 4.负载均衡原理 源码跟踪 LoadBalancerIntercepor LoadBalancerClient 5.负载均衡策略IRule 总结 1.什么是负载均衡 通俗的讲&#xff0c; 负载均衡就是将负载&#xff…

Java奠基】运算符的讲解与使用

目录 运算符与表达式的使用 算术运算符 隐式转换与强制转换 自增自减运算符 赋值运算符 关系运算符 逻辑运算符 三元运算符 运算符与表达式的使用 运算符是指&#xff1a;对字面量或者变量进行操作的符号。 表达式是指&#xff1a;用运算符把字面量或者变量连接起来&…

使用Geth搭建多节点私有链

使用Geth搭建多节点私有链 步骤 1.编辑初始化配置文件genesis.json {"config": {"chainId": 6668,"homesteadBlock": 0,"eip150Block": 0,"eip150Hash": "0x000000000000000000000000000000000000000000000000000000…

【工具插件类教学】UnityPackageManager私人定制资源工具包

目录 一.UnityPackageManager的介绍 二.package包命名 三.包的布局 四.生成清单文件 五.制作package内功能 六.为您的软件包撰写文档 1.信息的结构 2.文档格式 七.提交上传云端仓库 1.生成程序集文件 2.上传至云端仓库 八.下载使用package包 1.获取包的云端路径 …

Vue3 企业级项目实战:认识 Spring Boot

Vue3 企业级项目实战 - 程序员十三 - 掘金小册Vue3 Element Plus Spring Boot 企业级项目开发&#xff0c;升职加薪&#xff0c;快人一步。。「Vue3 企业级项目实战」由程序员十三撰写&#xff0c;2744人购买https://s.juejin.cn/ds/S2RkR9F/ 越来越流行的 Spring Boot Spr…

NJ+SCU42做Modbus RTU从站

NJSCU42做Modbus RTU从站实验时间&#xff1a;2023.2.28 硬件设备&#xff1a;NJ501-1300&#xff0c;CJ1W-SCU42 软件&#xff1a;Sysmac Studio&#xff0c;Commix串口调试助手 案例简介&#xff1a;发送Modbus RTU命令读取NJ里的数据 1. 系统概述 264 ​ 本次实验使用C…

回暖!“数”说城市烟火气背后

“人间烟火气&#xff0c;最抚凡人心”。在全国各地政策支持以及企业的积极生产运营下&#xff0c;经济、社会、生活各领域正加速回暖&#xff0c;“烟火气”在城市中升腾&#xff0c;信心和希望正在每个人心中燃起。 发展新阶段&#xff0c;高效统筹经济发展和公共安全&#…

[文件操作] File 类的用法和 InputStream, OutputStream 的用法

能吃是不是件幸福的事呢 文章目录前言1. 文件的相关定义2. 文件类型3. Java对文件系统的操作3.1 对文件的基础操作3.2 读文件3.3 写文件前言 从这章开始,我们就开始学文件操作相关的知识了~ 1. 文件的相关定义 1.文件的定义可以从狭义和广义两个方面解释. 狭义: 指硬盘上的文…

进程、线程、协程详解

目录 前言&#xff1a; 一、进程 进程的概念 进程内存空间 二、线程 线程的定义 内核线程 用户线程 内核线程和用户线程的比较 线程的状态 三、协程 协程的定义 协程序相对于线程优势 运用场景 四、线程、协程、进程切换比较 前言&#xff1a; 有时候无法…

原生JS实现拖拽排序

拖拽&#xff08;这两个字看了几遍已经不认识了&#xff09; 说到拖拽&#xff0c;应用场景不可谓不多。无论是打开电脑还是手机&#xff0c;第一眼望去的界面都是可拖拽的&#xff0c;靠拖拽实现APP或者应用的重新布局&#xff0c;或者拖拽文件进行操作文件。 先看效果图&am…

人力资源管理系统

技术&#xff1a;Java、JSP等摘要&#xff1a;在当今的信息化社会&#xff0c;为了更有效率地工作&#xff0c;人们充分利用现在的电子信息技术&#xff0c;在办公室架设起办公服务平台&#xff0c;将人力资源相关信息统一起来管理&#xff0c;帮助管理者有效组织降低成本和加速…

测试2年,当初一起入行的朋友很多月薪20k了,自己却还没过万,到底差在了哪里?

说来奇怪&#xff0c;不管是读书还是工作&#xff0c;都存在一个现象&#xff0c;那就是人比人&#xff0c;比死人。读书的时候&#xff0c;不管是老师还是家长口中&#xff0c;总会有一个“别人家的孩子”。同样&#xff0c;到工作中&#xff0c;领导口中总会有一个“别人的员…

代码随想录算法训练营day46 | 动态规划之背包问题 139.单词拆分

day46139.单词拆分1.确定dp数组以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp[i]139.单词拆分 题目链接 解题思路&#xff1a;单词就是物品&#xff0c;字符串s就是背包&#xff0c;单词能否组成字符串s&#xff0c;就是问物品能不能把背包装满。…

【微服务】-认识微服务

目录 1.1 单体、分布式、集群 单体 分布式 集群 1.2 系统架构演变 1.2.1 单体应⽤架构 1.2.2 垂直应⽤架构 1.2.3 分布式架构 1.2.4 SOA架构 1.2.5 微服务架构 1.3 微服务架构介绍 微服务架构的常⻅问题 1.4 SpringCloud介绍 1.4.1 SpringBoot和SpringCloud有啥关…

高压放大器知识科普介绍

高压放大器是一种用于放大高压信号的电子设备&#xff0c;具有高压输出&#xff0c;低噪声&#xff0c;高精度&#xff0c;高稳定性&#xff0c;高可靠性&#xff0c;低功耗&#xff0c;低成本等的优点&#xff0c;所以才被广泛应用在磁场探测、电磁脉冲放大、电磁波放大、电磁…

Arduino IDE启动闪退或者运行中闪退

文章目录一、你中了哪一种&#xff1f;1、安装了不符合规格的库文件2、安装了不符合规范的开发板库文件二、解决方案1、轻方案2、全盘重来Arduino IDE启动闪退或者运行中闪退&#xff0c;出现这样的问题&#xff0c;其实不需要思考了&#xff0c;就是运行库配置的问题&#xff…

(Trie Tree)字典树

&#xff08;Trie Tree&#xff09;字典树 场景&#xff1a;在n个字符串中查找某个字符串。 暴力匹配&#xff0c;时间复杂度为O&#xff08;nm&#xff09;&#xff0c;m为字符串平均长度&#xff0c;效率过低。 字典查找单词"fly"&#xff0c;首先查找’f’,然后…