【Python 千题 —— 算法篇】无重复字符最长子段

请添加图片描述

Python 千题持续更新中 ……
脑图地址 👉:⭐https://twilight-fanyi.gitee.io/mind-map/Python千题.html⭐

字符串处理

题目背景

在编程过程中,处理字符串的任务时常遇到,其中一个经典问题是查找无重复字符的最长子串。这在很多应用场景中有实际价值,例如在文本处理、数据分析、加密技术等领域中,确保字符串的唯一性和最长性是至关重要的。本题目要求我们不仅要找出最长的无重复字符的子串,还要优化算法,以应对大量输入的需求。

通过本题的学习,我们可以进一步提升对字符串的理解和操作,掌握滑动窗口、哈希表等高效的算法技巧。

题目描述

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

你需要实现一个函数 lengthOfLongestSubstring(),该函数接收一个字符串 s 作为输入,并返回无重复字符的最长子串的长度。

输入描述

  • 一个字符串 s,长度不超过 10^5,只包含 ASCII 字符。

输出描述

  • 一个整数,表示无重复字符的最长子串的长度。

示例

示例 ①

输入:

# 调用 lengthOfLongestSubstring() 函数
print(lengthOfLongestSubstring("abcabcbb"))

输出:

3

解释:无重复字符的最长子串是 “abc”,其长度为 3。

示例 ②

输入:

print(lengthOfLongestSubstring("bbbbb"))

输出:

1

解释:最长子串是 “b”,其长度为 1。


代码讲解与多种解法

解法一:暴力破解法

最简单的解法是尝试枚举字符串中每一个子串,并判断这个子串中是否包含重复字符。这种方法需要嵌套循环遍历每个子串,并检查是否有重复字符。

def lengthOfLongestSubstring(s):def is_unique(substring):return len(substring) == len(set(substring))n = len(s)max_len = 0for i in range(n):for j in range(i + 1, n + 1):if is_unique(s[i:j]):max_len = max(max_len, j - i)return max_len

优点:

  • 思路清晰,容易理解和实现。

缺点:

  • 时间复杂度为 O(n^3),对于较大的字符串,效率较低。

解法二:滑动窗口

暴力破解法的最大问题是效率低下,因为每次需要重新检查整个子串。通过滑动窗口的思想,我们可以有效地减少重复计算。滑动窗口法通过使用两个指针(startend)来维护一个窗口,并通过移动指针来寻找符合条件的最长子串。

def lengthOfLongestSubstring(s):n = len(s)if n == 0:return 0char_set = set()max_len = 0left = 0for right in range(n):while s[right] in char_set:char_set.remove(s[left])left += 1char_set.add(s[right])max_len = max(max_len, right - left + 1)return max_len

优点:

  • 时间复杂度降为 O(n),大大提高了性能。
  • 使用滑动窗口动态调整子串的范围,不需要重新计算每一个子串。

缺点:

  • 虽然时间复杂度较低,但内存占用可能稍大。

解法三:滑动窗口 + 哈希表

滑动窗口的效率已经不错,但我们还可以优化移除字符的操作。如果使用哈希表(即字典)来记录每个字符最后一次出现的位置,我们可以更加精确地调整窗口的左端,而不需要逐个移除字符。

def lengthOfLongestSubstring(s):n = len(s)if n == 0:return 0char_index = {}max_len = 0left = 0for right in range(n):if s[right] in char_index:left = max(char_index[s[right]] + 1, left)char_index[s[right]] = rightmax_len = max(max_len, right - left + 1)return max_len

优点:

  • 更加高效,进一步减少不必要的操作。
  • 保持 O(n) 的时间复杂度,并优化了滑动窗口的移动。

缺点:

  • 相较于滑动窗口,增加了一些额外的空间复杂度,用于存储哈希表。

总结与思考

在解决无重复字符最长子串问题时,我们可以通过多种方法进行尝试:

  1. 暴力破解法:适合初学者学习和理解,但实际应用中性能较差。
  2. 滑动窗口:通过维护一个窗口的字符集,减少了重复检查,提高了效率。
  3. 滑动窗口 + 哈希表:在滑动窗口的基础上进一步优化,通过哈希表来快速调整窗口,提升了效率。

在处理大型字符串数据时,选择合适的算法是至关重要的。滑动窗口和哈希表结合的算法是目前解决该类问题的最优选择,它在实际应用中的表现非常出色。

扩展思考

无重复字符的最长子串问题不仅仅是对字符的简单处理,它也能用于多个复杂场景,例如:

  • 在密码学中,寻找不重复的字符片段可以用于增强密码的安全性。
  • 在自然语言处理中,最长不重复子串可以帮助我们分析文本结构。
  • 在压缩算法中,可以利用不重复字符的子串来提升压缩效率。

通过本题的练习,不仅能够提升我们对字符串操作的理解,也能让我们在处理类似问题时有更好的应对方案。


希望通过本文的讲解,你能掌握无重复字符最长子串的几种常见算法,并学会如何在实际编程中高效地解决字符串问题!

持续关注博客,获取更多编程练习与技巧!
作者信息

作者 : 繁依Fanyi
CSDN: https://techfanyi.blog.csdn.net
掘金:https://juejin.cn/user/4154386571867191

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

KRTSt内嵌Lua脚本

KRTSt内嵌Lua脚本 Lua 简介 Lua是一门强大、高效、轻量、可嵌入的脚本语言。它支持多种编程架构:过程编程、面向对象编程(OOP)、函数式编程、数据驱动编程及数据描述。 Lua结合了简洁的过程语法和强大的数据描述结构(基于关联数…

《Web性能权威指南》-网络技术概览-读书笔记

注:TCP/IP等知识牵涉面太广,且不说本文,哪怕是原书,限于篇幅,很多知识点都是大致介绍下。如果想深入理解,需要更一步Google相关页面资料。 延迟与带宽 WPO,Web Performance Optimization&…

算法day09 二叉树

class Node<V>{V value;Node left;Node right; } 一、用递归和非递归分别实现二叉树的前序&#xff0c;中序&#xff0c;后序遍历 非递归方式&#xff1a; 前序遍历 根左右 0&#xff09;利用stack后进先出的特点 要输出根左右的顺序&#xff0c;将元素右边先放入栈中…

【CanMV K230】圆形检测

【CanMV K230】圆形检测 什么是圆形检测圆形检测应用领域1.工业自动化2.机器人视觉3.医学图像分析4.目标识别5.质量检测6.研究和开发 K230应用相关函数官方例程HDMI屏幕使用圆形检测 本篇内容&#xff1a; 什么是圆形检测圆形检测应用领域K230应用&#xff08;包含相应函数及例…

SAP学习笔记 - 开发03 - CDSView开发环境搭建,Eclipse中连接SAP,CDSView创建

上一章讲了BTP的账号创建&#xff0c;环境搭建等内容。 SAP学习笔记 - 开发02 - BTP实操流程&#xff08;账号注册&#xff0c;BTP控制台&#xff0c;BTP集成开发环境搭建&#xff09;-CSDN博客 本章继续讲SAP开发。 - CDSView 的开发环境&#xff08;Eclipse&#xff09;搭建…

C++初阶:STL详解(一)——string类

✨✨小新课堂开课了&#xff0c;欢迎欢迎~✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C&#xff1a;由浅入深篇 小新的主页&#xff1a;编程版小新-CSDN博客 1.为什么会有string类 C 语言中&#xff0c…

驾驭不断发展的人工智能世界

从很多方面来看&#xff0c;历史似乎正在重演。许多企业正争相采用生成式人工智能 (Gen AI)&#xff0c;就像它们争相采用云计算一样&#xff0c;原因也是一样的&#xff1a;效率、成本节约和竞争优势。 然而&#xff0c;与云一样&#xff0c;GenAI 仍是一项发展中的技术&…

Kafka 分布式消息系统详细介绍

Kafka 分布式消息系统 一、Kafka 概述1.1 Kafka 定义1.2 Kafka 设计目标1.3 Kafka 特点 二、Kafka 架构设计2.1 基本架构2.2 Topic 和 Partition2.3 消费者和消费者组2.4 Replica 副本 三、Kafka 分布式集群搭建3.1 下载解压3.1.1 上传解压 3.2 修改 Kafka 配置文件3.2.1 修改z…

网络原理之TCP协议(万字详解!!!)

目录 前言 TCP协议段格式 TCP协议相关特性 1.确认应答 2.超时重传 3.连接管理&#xff08;三次握手、四次挥手&#xff09; 三次握手&#xff08;建立TCP连接&#xff09; 四次挥手&#xff08;断开连接&#xff09; 4.滑动窗口 5.流量控制 6.拥塞控制 7.延迟应答…

gazebo 已加载模型但无法显示

目录 写在前面的话问题一&#xff1a;robot_state_publisher 发布机器人信息失败报错一 Error: Error document empty.报错二 .xcaro 文件中有多行注释成功启动 问题二&#xff1a;通过 ros2 启动 gazebo 失败成功启动 问题三&#xff1a;gazebo 崩溃和无法显示模型问题四&…

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证&#xff1a;Authentication1.2 鉴权&#xff1a;Authorization1.3 准入控制&#xff1a;Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes…

Pr:首选项 - 音频

Pr菜单&#xff1a;编辑/首选项 Edit/Preferences Premiere Pro 首选项中的“音频” Audio选项卡主要作用是控制音频的处理设置&#xff0c;包括音量调整、波形生成、音频渲染等选项&#xff0c;这些设置有助于优化音频的处理和编辑工作&#xff0c;适用于不同的剪辑需求和项目…

VS Code 调试go程序的相关配置说明

用 VS code 调试Go程序需要在.vscode/launch.json文件中增加如下配置&#xff1a; // launch.json {// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information, visit: https://go.microsoft.…

RISC-V (十二)系统调用

系统模式&#xff1a;用户态和内核态 当前的代码都是实现在machine模式下。 系统模式的切换 epc寄存器的值存放的是ecall指本身的地址 。 用ecall指令 系统调用的执行流程 mret这条指令会利用status的mpp值恢复到之前的特权级别。 蓝色的线表示涉及到权限切换。 系统调用的传…

想要从OPPO手机恢复数据?免费OPPO照片视频恢复软件

此实用程序可帮助那些寻找以下内容的用户&#xff1a; 在OPPO手机中格式化存储卡后可以恢复图片吗&#xff1f;我删除了 OPPO上的视频和图片&#xff0c;我感觉很糟糕&#xff0c;因为里面有我在拉斯维加斯拍摄的视频和照片 免费OPPO照片视频恢复软件 您能恢复OPPO上已删除的…

JavaScript拷贝的艺术:玩转深拷贝和浅拷贝

前言 在实际的项目开发中&#xff0c;我们时刻都在使用数据拷贝功能&#xff0c;赋值、深拷贝和浅拷贝是前端开发中常见的概念&#xff0c;用于复制简单数据类型&#xff08;字符串、数值、布尔值&#xff09;和引用类型&#xff08;对象、数组&#xff09;。它们的主要区别在…

spring中添加@Test注解测试

1、添加maven依赖 <!-- 添加test方便测试--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency><dependency><grou…

C语言进阶版第8课—指针(2)

文章目录 1. 数组名的理解2. 指针访问数组3. 一维数组传参本质4. 冒泡排序5. 二级指针6. 指针数组7. 指针数组模拟二维数组 1. 数组名的理解 sizeof&#xff08;数组名&#xff09;— 这里的数组名代表整个数组&#xff0c;计算的也是整个数组的大小&数组名 — 这里的数组名…

HTML 基础,尚优选网站设计开发(二)

最近在恶补HTML相关知识点&#xff0c;本人是后端程序员&#xff0c;看到周围很多人都被裁员了&#xff0c;突然想尽早转变成全栈程序员变成独立开发者&#xff0c;有空余接接私单、商单的 尚优选网站设计开发&#xff0c;HTMLCSSJavaScript实际使用 尚优选网站设计开发页面分析…

KDD 2024 时空数据(Spatio-temporal) Research论文总结

2024 KDD&#xff08; ACM SIGKDD Conference on Knowledge Discovery and Data Mining, 知识发现和数据挖掘会议&#xff09;在2024年8月25日-29日在西班牙巴塞罗那举行。 本文总结了KDD2024有关时空数据(Spatial-temporal) 的相关论文&#xff0c;如有疏漏&#xff0c;欢迎大…