LeetCode刷题:无重复字符的最长子串 详解 【3/1000 第三题】

👤作者介绍:10年大厂数据\经营分析经验,现任大厂数据部门负责人。
会一些的技术:数据分析、算法、SQL、大数据相关、python
作者专栏每日更新:
LeetCode解锁1000题: 打怪升级之旅

LeetCode解锁1000题: 打怪升级之旅https://blog.csdn.net/cciehl/category_12625714.html
python数据分析可视化:企业实战案例https://blog.csdn.net/cciehl/category_12615648.html
备注说明:方便大家阅读,统一使用python,带必要注释,公众号 数据分析螺丝钉 一起打怪升级

在字符串处理问题中,力扣(LeetCode)题库中的“无重复字符的最长子串”是一个经典的问题。这个问题的目标是从给定的字符串中找到最长的不含有重复字符的子串。

问题描述

给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。

示例:

输入: "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

解题思路-哈希集合

算法步骤

  1. 初始化:定义两个指针,一个哈希集合,和一个用于记录最长子串长度的变量。
  2. 滑动窗口:用两个指针表示字符串中的某个子串(或窗口),随着遍历的进行,调整指针和窗口的大小。
  3. 更新哈希集合:通过哈希集合来判断字符是否重复,并据此调整左指针。
  4. 更新最长长度:每次窗口滑动时,更新不含重复字符的最长子串的长度。

时间复杂度

算法的时间复杂度为 O(n),其中 n 是字符串的长度。在最坏的情况下,每个字符将被访问两次(由两个指针各一次)。

空间复杂度

空间复杂度为O(min(m,n)),其中 m 是字符集(字母表)的大小。这是因为哈希集合的大小取决于字符串的大小 n 和字符集的大小 m。

代码示例(Python) 

def length_of_longest_substring(s: str) -> int:char_set = set()left = max_length = 0for right in range(len(s)):while s[right] in char_set:char_set.remove(s[left])left += 1char_set.add(s[right])max_length = max(max_length, right - left + 1)return max_length# 测试代码
input_string = "abcabcbb"
print(length_of_longest_substring(input_string))

代码解释

  • 我们遍历输入字符串,使用两个指针 leftright 表示当前考虑的子串。
  • 我们使用一个集合 char_set 来存储当前子串中的字符。
  • 当我们碰到一个已经存在于集合中的字符时,我们就不断地移动左指针,并从集合中移除相应的字符,直到这个字符不再出现在集合中。
  • 每次我们都会更新最大长度 max_length

其他思路-字符集为数组

利用字符集为数组的方法特别适用于字符集大小固定且较小的情况,例如ASCII字符集。这种方法利用数组的索引来代表字符,数组的值来表示字符最后一次出现的位置。这样,我们可以在 O(1) 的时间内检查和更新每个字符的最后出现位置,从而在遍历字符串时快速判断当前字符是否重复,以及如何移动滑动窗口的起始位置。

代码示例

def length_of_longest_substring(s: str) -> int:# 初始化字符最后一次出现位置的数组,-1 表示字符尚未出现last_index = [-1] * 128  # ASCII 字符集大小为 128max_length = 0start = 0  # 滑动窗口的起始位置for i, char in enumerate(s):# 更新滑动窗口的起始位置# 如果当前字符之前出现过,则更新窗口起始位置为上一次出现位置 + 1if last_index[ord(char)] != -1:start = max(start, last_index[ord(char)] + 1)# 更新当前字符的最后出现位置last_index[ord(char)] = i# 计算当前无重复字符子串的长度,并更新最大长度max_length = max(max_length, i - start + 1)return max_length# 测试代码
input_string = "abcabcbb"
print(length_of_longest_substring(input_string))

这段代码首先初始化一个长度为128的数组last_index来存储每个ASCII字符最后一次出现的索引位置,初始值为-1表示字符未出现。随后遍历字符串,使用ord(char)获取字符的ASCII值作为索引,通过last_index数组来快速查找字符最后一次出现的位置,并据此更新滑动窗口的起始位置start。最终,通过比较每个字符对应的无重复字符子串长度来得到最大值。

算法对比

  1. 时间复杂度:这个方法仍然保持 O(n) 的时间复杂度,与基于哈希集合的滑动窗口方法相同。
  2. 空间复杂度:当字符集大小固定且较小时(比如ASCII字符集),这种方法的空间复杂度实际上是 O(1),相较于哈希集合方法(在最坏情况下可能接近 O(n),尽管实际使用中较少达到这个上限)更优。
  3. 操作复杂度:使用数组直接访问和更新字符的最后一次出现位置,操作更为直接和高效,特别是在字符集较小的情况下。

因此,如果你确定字符集的大小是固定和有限的,利用字符集为数组的方法在理论上是更优的选择,尤其是在空间复杂度上。然而,这种方法的优势主要体现在处理小字符集的字符串上,例如ASCII字符集。

但是,如果问题涉及到更大的字符集,比如Unicode字符集,哈希集合的方法可能更加灵活和通用,因为它不受字符编码范围的限制。同时,哈希集合方法的代码通常更简洁、易于理解和维护,特别是对于那些对特定编码方式不太熟悉的开发者。

 

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

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

相关文章

【THM】Active Reconnaissance(主动侦察)-初级渗透测试

介绍 在网络安全模块的第一个房间里,我们主要进行被动侦察。在第二个房间中,我们重点关注主动侦察以及与之相关的基本工具。我们学习使用网络浏览器来收集有关我们目标的更多信息。此外,我们讨论使用简单的工具(例如ping、traceroute、telnet和 )nc来收集有关网络、系统和…

探讨在大数据体系中API的通信机制与工作原理

** 引言 关联阅读博客文章:深入解析大数据体系中的ETL工作原理及常见组件 关联阅读博客文章:深入理解HDFS工作原理:大数据存储和容错性机制解析 ** 在当今数字化时代,数据已经成为企业发展和决策的核心。随着数据规模的不断增长…

计算机组成原理实验(汉字编码实验)

(汉字编码实验) 海明校验码实验

每天五分钟计算机视觉:如何基于滑动窗口技术完成目标的检测?

汽车检测算法 现在我们想要构建一个汽车检测算法,我们希望输入到算法中一张图片,算法就可以帮助我们检测出这张图片中是否有汽车。 数据集 首先创建一个标签训练集,x是样本,y是标签。我们的训练集最好是被剪切过的图片,剪掉汽车以外的部分,使汽车居于中间位置,就是整张…

LeetCode-240. 搜索二维矩阵 II【数组 二分查找 分治 矩阵】

LeetCode-240. 搜索二维矩阵 II【数组 二分查找 分治 矩阵】 题目描述:解题思路一:从左下角或者右上角元素出发,来寻找target。解题思路二:右上角元素,代码解题思路三:暴力也能过解题思路四:二分…

家庭网络防御系统搭建-配置流量镜像到NDR系统

由于需要将家庭网络中的全部流量送到NDR分析系统进行分析,因此需要一个具备流量镜像功能的交换机或者路由器。在前面文章所提及的家庭网络架构中,需要一台交换机即可拷贝东西向流量以及南北向流量。当然如果家庭中的路由器或者其他设备具备交换机镜像功能…

基于单片机智能数字温度采集报警器系统设计

**单片机设计介绍,基于单片机智能数字温度采集报警器系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机智能数字温度采集报警器系统设计的核心目标是通过单片机实现温度的实时采集、显示以及超温报警…

深度学习_NLP常用库报错问题解决

1、SpaCy can‘t find model ‘zh_core_web_sm‘. It doesn‘t seem to be a python package or a valid path to a data 或者 can‘t find model ‘en_core_web_sm‘. It doesn‘t seem to be a python package or a valid path to a data 安装最新的版本: en_…

C++项目——集群聊天服务器项目(七)Model层设计、注册业务实现

在前几节的研究中,我们已经实现网络层与业务层分离,本节实现数据层与业务层分离,降低各层之间的耦合性,同时实现用户注册业务。 网络层专注于处理网络通信与读写事件 业务层专注于处理读写事件到来时所需求的各项业务 数据层专…

UE5 SQLite笔记

开发环境: 系统:Windows 10 64 bit 引擎:Unreal Engine 5.1.1 IDE:JetBrains Rider 2023.2.1 语言:C 工具:DB Browser for SQLite SQLite数据类型: //INTEGER TEXT BLOB REAL NUMERIC/*integer…

关于OpenFeign的返回类型包装问题

在一天夜里。我在使用feign的调用时,突然出现了一点点问题。 就是对于feign类型的包装问题。产生了疑问。 在后来,也就是今天。在网上取取经。看到了一个答案。说:feign的调用会有一个编码器和解码器。 使用feign的解码器。他的原理也很简…

NoSQL之Redis配置

文章目录 NoSQL之Redis配置一、关系数据库和非关系数据库1、关系型数据库2、非关系型数据库3、非关系型数据库产生背景4、关系型数据库和非关系型数据库的区别4.1 数据存储方式不同4.2 扩展方式不同4.3 对事务性的支持不同 5、总结5.1 关系型数据库5.2 非关系型数据库 二、Redi…

基于springboot实现房屋租赁管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现房屋租赁系统演示 摘要 房屋是人类生活栖息的重要场所,随着城市中的流动人口的增多,人们对房屋租赁需求越来越高,为满足用户查询房屋、预约看房、房屋租赁的需求,特开发了本基于Spring Boot的房屋租赁系统。 …

鸿蒙实战开发-如何使用三方库

使用三方库 在使用三方库之前,需要安装 ohpm,并在环境变量中配置。 在项目目录的Terminal窗口执行ohpm命令下载依赖 ohpm install yunkss/eftool 命令运行成功后,在项目的oh-package.json5文件中会自动添加上依赖,如下所示&am…

JimuReport积木报表 v1.7.4 正式版本发布,免费的JAVA报表工具

项目介绍 一款免费的数据可视化报表,含报表和大屏设计,像搭建积木一样在线设计报表!功能涵盖,数据报表、打印设计、图表报表、大屏设计等! Web 版报表设计器,类似于excel操作风格,通过拖拽完成报…

Qt加载.css/.qss文件设置控件的QSS样式(支持程序运行时修改且立即生效类似换肤效果)

初学Qt时,你是如何设置QWidget,QPushButton等原生基础控件的样式的?是不是主要是两种方法? 1.直接在可视化的.ui文件中直接添加qss语句。 2.在代码中通过setStyleSheet(QString qss)来设置qss语句。 上述两种方法,在程…

【数据结构】你知道波兰表达式和逆波兰表达式吗?我才知道原来栈在表达式求值中还能这样使用……

栈在表达式求值中的应用 导读一、表达式的形式二、波兰表达式与逆波兰表达式三、表达式之间的相互转换四、栈实现波兰表达式4.1 问题分析4.2 问题完善4.3 算法实现4.3.1 获取波兰表达式4.3.2 从右往左扫描表达式4.3.3 遇到操作数进行入栈操作4.3.4 遇到操作符进行对应操作4.3.5…

Qt元对象系统

第二章Qt元对象系统 文章目录 第二章Qt元对象系统1.什么是元对象?2.元对象系统组成3.信号与槽信号和槽的本质绑定信号与槽自定义槽定义槽函数必须遵循一下规则槽函数的类型自定义槽案例 自定义信号自定义信号需要遵循以下规则信号和槽重载二义性问题 4.内存管理1. 简…

原生小程序开发性能优化指南

性能优化指南 1.骨架屏 业务可以在数据加载完成之前用骨架屏幕来占位,提升体验。 2.包大小优化 减小包中静态资源,例如图片文件,可将图片进行压缩降低文件体积。无用文件、函数、样式剔除。除了部分用于容错的图片必须放在代码包&#xf…

了解游戏相关知识

个人笔记(整理不易,有帮助点个赞) 笔记目录:学习笔记目录_pytest和unittest、airtest_weixin_42717928的博客-CSDN博客 个人随笔:工作总结随笔_8、以前工作中都接触过哪些类型的测试文档-CSDN博客 目录 一&#xff1a…