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 = 0
    
    for right in range(len(s)):
        while s[right] in char_set:
            char_set.remove(s[left])
            left += 1
        char_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 字符集大小为 128
    max_length = 0
    start = 0  # 滑动窗口的起始位置
    
    for i, char in enumerate(s):
        # 更新滑动窗口的起始位置
        # 如果当前字符之前出现过,则更新窗口起始位置为上一次出现位置 + 1
        if 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字符集,哈希集合的方法可能更加灵活和通用,因为它不受字符编码范围的限制。同时,哈希集合方法的代码通常更简洁、易于理解和维护,特别是对于那些对特定编码方式不太熟悉的开发者。

 

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

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

相关文章

LeNet卷积神经网络

文章目录 简介conv2d网络层的结构 简介 它是最早发布的卷积神经网络之一 conv2d 这个卷积成的参数先进行介绍一下: self.conv1 nn.Conv2d(in_channels3, out_channels10, kernel_size3, stride1, padding1)先看一下in_channels 输入的通道数,out_cha…

前端常用代码整理— js,jquery篇(3)

目录 1.判断是否是json字符串 2.获取当前网址 3.将文本复制到剪贴板 4.获取一个月的天数 5.展平数组 6.要修改getRandomItem函数以返回数组中的随机两个元素,可以尝试以下代码 1.判断是否是json字符串 const isJson str > {try {JSON.parse(str);return …

【JavaWeb】Day30.SpringBootWeb请求响应——响应

响应 HTTL协议的交互方式:请求响应模式(有请求就有响应)那么Controller程序,除了接收请求外,还可以进行响应。 1.ResponseBody 在我们前面所编写的controller方法中,都已经设置了响应数据。 controller方…

基于ArgoCD和Testkube打造GitOps驱动的Kubernetes测试环境

本文介绍了一项新工具,可以基于Gitops手动或者自动实现Kubernetes集群应用测试,确保集群的健康状态与Git仓库定义的一致。原文: GitOps-Powered Kubernetes Testing Machine: ArgoCD Testkube 简介:GitOps 云原生测试面临的挑战 现代云原生应…

Unity中UI系统1——GUI

介绍 工作原理和主要作用 基本控件 a.文本和按钮控件 练习: b.多选框和单选框 练习: 用的是第三种方法 c.输入框和拖动框 练习: 练习二: e.图片绘制和框 练习: 复合控件 a.工具栏和选择网格 练习: b.滚动视…

【stm32】USART编码部分--详细步骤

USART编码部分(文章最后附上源码) 如果看不懂步骤可以根据源码参考此篇文章就能轻而易举学会USART通信啦! 编码步骤 第一步 开启时钟 把需要用到的USART和GPIO的时钟打开 第二部 GPIO初始化 把TX配置成复用输出,RX配置成输入(上拉输入、浮空输入)。…

CCIE-12-IPSec-VPN-RemoteAccess

目录 实验条件网络拓朴实验目的 开始配置1. R2 Ping R3确定基础网络是通的2. 配置R23. 配置R53. 验证 实验条件 网络拓朴 实验目的 为R2和R3建立IPSec VPN R4可以ping通R5 开始配置 R2:模拟需要远程访问网络的网关 R4:模拟需要远程访问网络内的目标主…

selenium 遮罩层

之前写智联自动投简历 和boss自动投简历的时候 发现操作到上限之后就有个遮罩层,会在当前页面有个顶层得div 没办法获取下面的内容 # 假设遮罩层元素有一个特定的ID或者其他属性 没有id xpath 或者class 都可以mask_element WebDriverWait(driver, 10).until(EC.…

农业信息管理(源码+文档)

农业信息管理系统(小程序、ios、安卓都可部署) 文件包含内容程序简要说明功能项目截图客户端首页我的今日动态动态详情登录修改资料今日价格今日报价注册页 后端管理文章管理用户管理分类管理 文件包含内容 1、搭建视频 2、流程图 3、开题报告 4、数据库…

Python:百度AI开放平台——OCR图像文字识别应用

一、注册百度AI开放平台 使用百度AI服务的步骤为: 注册:注册成为百度AI开放平台开发者;创建AI应用:在百度API开放平台上创建相关类型的的AI应用,获得AppID、API Key和Secret Key;调用API:调用…

AR和VR如何改变客户体验?

How AR and VR are transforming customer experiences? How AR and VR are transforming customer experiences AR和VR如何改变客户体验 AR and VR technology was largely expedited by the past pandemic with at least 93.3 million and 58.9 million users r…

基于Java+SpringBoot+Mybaties+layui+Vue+elememt 实习管理系统 的设计与实现

一.项目介绍 前台功能:用户进入系统可以实现首页,系统公告,个人中心,后台管理等功能进行操作 后台由管理员,实习单位,教师和学生,主要功能包括首页,个人中心,班级管理&am…

ETL工具-nifi干货系列 第六讲 处理器JoltTransformJSON

1、处理器作用 使用Jolt转换JSON数据为其他结构的JSON,成功的路由到success,失败的failure。处理JSON的实用程序不是基于流的,因此大型JSON文档转换可能会消耗大量内存。 Jolt:JSON 到 JSON 转换库,用 Java 编写,其中转换的 &qu…

【Jmeter+Influxdb+Grafana性能监控平台安装与部署】

JmeterInfluxdbGrafana性能监控平台安装与部署 前言Influxdb安装与连接Jmeternfluxdb下载(winodws)Grafana安装与配置 前言 我们在性能测试过程中,在需要较大并发时,为了尽量避免使用GUI界面来节省资源,通常使用命令行…

EfficientVMamba实战:使用EfficientVMamba实现图像分类任务(一)

文章目录 摘要安装包安装timm 数据增强Cutout和MixupEMA项目结构编译安装Vim环境环境安装过程安装库文件 计算mean和std生成数据集 摘要 论文:https://arxiv.org/pdf/2401.09417v1.pdf 作者研究了轻量级模型设计的新方法,通过引入视觉状态空间模型&…

Leetcode 4.1

LeetCode 热题 100 贪心算法1.买卖股票的最佳时机2.跳跃游戏3.跳跃游戏 II4.划分字母区间 区间合并1.合并区间 贪心算法 1.买卖股票的最佳时机 买卖股票的最佳时机 买的那天一定是卖的那天之前的最小值。 每到一天,维护那天之前的最小值即可。 在题目中&#xff0…

LAN和WAN, 调制解调器, 路由器,交换机 区别

LAN LAN(Local Area Network)是指在相对较小的地理范围内(如办公室、学校、实验室、家庭等)连接在一起的计算机和网络设备的集合。LAN通常由路由器、交换机、网线、无线路由器等设备组成,用于连接多台计算机、打印机、…

实验四 Spark Streaming编程初级实践

一、Flume简介 数据流 :数据流通常被视为一个随时间延续而无限增长的动态数据集合,是一组顺序、大量、快速、连续到达的数据序列。通过对流数据处理,可以进行卫星云图监测、股市走向分析、网络攻击判断、传感器实时信号分析。 二、Flume安装…

Mysql故障和优化

一、MySQL故障 二、MySQL优化 1.硬件优化: 2.数据库设计与规划 1.提前估计数据量,使用什么存储引擎 2.数据库服务器专机专用,避免额外的服务可能导致的性能下降和不稳定性 3.增加多台服务器,以达到稳定、高效的效果。主从同步、…

C++ 2024-4-1 作业

#include <iostream> using namespace std;class A { public:int a;A(int a):a(a){cout<<"A的有参构造"<<endl;} }; class B:virtual public A { public:int b;B(int a,int b):A(a),b(b){cout<<"B的有参构造"<<endl;} }; cl…