当前位置: 首页 > article >正文

解决最长无重复子串问题

在编程面试中,字符串处理常常是考察算法能力的重要部分。今天,我们将探讨一个经典问题——最长无重复子串问题,并给出 Python 代码实现。

问题描述

给定一个字符串 s,你需要找到其中最长的无重复字符的子串,并返回它的长度。

例如:

  • 输入:s = "abcabcbb"
  • 输出:3,因为 "abc" 是最长的无重复字符子串,长度为 3。

解题思路

解决这个问题的常见方法是使用滑动窗口技术。在这种方法中,我们通过维护一个窗口来跟踪当前的子串,并且使用一个哈希表来快速判断当前子串中是否有重复字符。

具体步骤如下:

  1. 滑动窗口:我们使用两个指针来定义一个窗口,窗口的左边指针 left 和右边指针 right。右边指针向右扩展,尝试通过不断增加新的字符来扩展窗口。当遇到重复字符时,左边指针将被移动,从而缩小窗口,直到窗口内没有重复字符为止。

  2. 哈希表:我们使用一个哈希表 str_dict 来记录每个字符上次出现的位置。如果遇到重复字符,就可以通过哈希表直接找到重复字符上次出现的位置,并更新左边指针的位置。

  3. 最大长度:在每次扩展窗口时,我们记录当前窗口的长度 index - left + 1,并更新最长的无重复子串的长度。

代码实现

下面是这个算法的 Python 实现:

class Solution(object):def lengthOfLongestSubstring(self, s):""":type s: str:rtype: int"""max_len = 0              # 用来保存最长无重复子串的长度str_dict = {}             # 用来存储每个字符最后一次出现的索引left = 0                  # 滑动窗口的左指针# 遍历字符串for index, char in enumerate(s):# 如果当前字符在 str_dict 中且位置大于等于 left,说明有重复字符if char in str_dict and str_dict[char] >= left:# 更新左指针,跳过重复字符left = str_dict[char] + 1# 更新字符的最新位置str_dict[char] = index# 计算当前窗口的长度并更新最大长度max_len = max(max_len, index - left + 1)return max_len

代码解析

1. 初始化

  • max_len:用来存储当前找到的最长无重复子串的长度,初始化为 0。
  • str_dict:这是一个字典,记录每个字符的最新索引。这样可以快速查找字符是否重复以及其位置。
  • left:滑动窗口的左指针,初始化为 0。

2. 遍历字符串

我们通过 enumerate(s) 来遍历字符串 sindex 是当前字符的索引,char 是当前字符。

  • 重复字符处理:如果字符 char 已经在 str_dict 中,并且它的最后出现位置 str_dict[char] 大于等于当前的 left 指针,那么说明当前字符是重复的。此时,更新 left 指针为重复字符位置的下一个位置,即 left = str_dict[char] + 1

  • 更新哈希表:无论是否有重复字符,我们都会更新当前字符的最新位置,即 str_dict[char] = index

  • 计算当前窗口的长度:通过 index - left + 1 计算当前窗口的长度,并更新 max_len,保持最大值。

3. 返回结果

在循环结束后,max_len 就是最长无重复子串的长度,我们将其返回。

示例分析

示例 1

输入:

s = "abcabcbb"

处理过程:

  1. 第一个字符 'a',没有重复,max_len = 1
  2. 第二个字符 'b',没有重复,max_len = 2
  3. 第三个字符 'c',没有重复,max_len = 3
  4. 第四个字符 'a',重复,更新 left = 1max_len 不变。
  5. 第五个字符 'b',重复,更新 left = 2max_len 不变。
  6. 第六个字符 'c',重复,更新 left = 3max_len 不变。
  7. 第七个字符 'b',重复,更新 left = 4max_len 不变。
  8. 第八个字符 'b',重复,更新 left = 5max_len 不变。

最终返回值是 3,最长无重复子串为 "abc"。

示例 2

输入:

s = "bbbbb"

处理过程:

  1. 第一个字符 'b',没有重复,max_len = 1
  2. 第二个字符 'b',重复,更新 left = 1max_len 不变。
  3. 第三个字符 'b',重复,更新 left = 2max_len 不变。
  4. 第四个字符 'b',重复,更新 left = 3max_len 不变。
  5. 第五个字符 'b',重复,更新 left = 4max_len 不变。

最终返回值是 1,最长无重复子串为 "b"。

示例 3

输入:

s = "pwwkew"

处理过程:

  1. 第一个字符 'p',没有重复,max_len = 1
  2. 第二个字符 'w',没有重复,max_len = 2
  3. 第三个字符 'w',重复,更新 left = 2max_len 不变。
  4. 第四个字符 'k',没有重复,max_len = 3
  5. 第五个字符 'e',没有重复,max_len = 4
  6. 第六个字符 'w',重复,更新 left = 4max_len 不变。

最终返回值是 3,最长无重复子串为 "wke"。

时间复杂度与空间复杂度

时间复杂度

  • 遍历字符串需要 O(n) 的时间,其中 n 是字符串的长度。
  • 每次查找和更新哈希表的操作是常数时间 O(1)。 因此,总的时间复杂度是 O(n)

空间复杂度

  • 哈希表 str_dict 最多存储 O(n) 个字符。 因此,空间复杂度是 O(n)

总结

本题通过滑动窗口的方式解决了最长无重复子串的问题。这种方法不仅高效,而且直观。掌握滑动窗口技术在解决类似问题时十分有用,尤其是处理字符串、数组等线性数据结构时。希望这篇文章能帮助你更好地理解并实现这个经典问题!

相关文章:

解决最长无重复子串问题

在编程面试中,字符串处理常常是考察算法能力的重要部分。今天,我们将探讨一个经典问题——最长无重复子串问题,并给出 Python 代码实现。 问题描述 给定一个字符串 s,你需要找到其中最长的无重复字符的子串,并返回它…...

ASP .NET Core 学习(.NET9)Serilog日志整合

Serilog 是一个功能强大的 .NET 日志库,以其简洁的配置和灵活的输出方式而受到开发者喜爱。支持多种日志输出目标(如控制台、文件、数据库等),并且可以通过结构化日志的方式记录丰富的上下文信息,便于后续的日志分析和…...

基于python+flask+mysql的川渝地区天气数据分析系统

系统首页 天气数据分析 历史天气数据查询 python爬虫代码展示 import requests import re import time as delay from bs4 import BeautifulSoup import pandas as pd import pymysql import json# 定义一个函数,用于获取网页的源代码 def get_page(url, headers)…...

一个结合创意与技术的Python数据可视化案例,展示动态3D粒子轨迹图与热力图的融合效果,代码包含注释与关键技术点解析

以下是一个结合创意与技术的Python数据可视化案例,展示动态3D粒子轨迹图与热力图的融合效果,代码包含注释与关键技术点解析: import numpy as np import pandas as pd import matplotlib.pyplot as plt from matplotlib.animation import Fu…...

【Linux———信号精讲】

你是怎么做到的,给了她想要的爱............................................................................................ 文章目录 前言 一、【信号入门】 1.1、【生活角度的信号】 1.2、【ctrl c与z】 1.3、【信号的发送与记录】 1.4、【信号处理常见方式…...

scBaseCamp:一个AI代理的可持续扩充的单细胞数据存储库

scBaseCamp是Tahoe-100M:最大规模的单细胞扰动数据集的后续 构建虚拟细胞是人工智能与生物学交叉领域的新兴前沿方向,单细胞RNA测序数据的快速增长为这一领域提供了助力。通过整合数百项研究中数百万个细胞的基因表达谱,单细胞图谱为训练由 …...

GPTs+RPA赋能智慧校园:构建下一代教育智能体的技术实践

文章目录 一、核心应用场景与技术融合1. 教务流程自动化(RPAGPTs双引擎驱动)2. 智能问答中枢(NLP流程自动化) 二、关键技术实现方案1. 多模态数据处理架构2. 智能文档处理流水线 三、典型系统架构设计智慧校园AI中台架构&#xff…...

Linux 系统不同分类的操作命令区别

Linux 系统有多种发行版,每种发行版都有其独特的操作命令和工具。以下是一些常见的分类及其操作命令的区别: 1. 基于 Red Hat 的发行版 (RHEL, CentOS, Fedora) 1.1 包管理 安装软件包: bash复制 sudo yum install <package> 更新软件包: bash复制 sudo yum update…...

集成的背景与LLM集成学习

文章目录 集成的背景与LLM集成学习LLVM集成指南Azure OpenAl集成Hugging Face Hub集成集成的背景与LLM集成学习 任何新的技术框架或工具,往往需要对其背后的原理和历史背景有所了解,这样可以更好地掌握它的应用方式和最佳实践。在探讨为什么学习LangChain的集成项目之前,先看…...

【AIGC】通义万相 2.1 与蓝耘智算:共绘 AIGC 未来绚丽蓝图

一、引言 在人工智能技术迅猛发展的今天&#xff0c;AIGC&#xff08;生成式人工智能内容生成&#xff09;领域正以惊人的速度改变着我们的生活和工作方式。从艺术创作到影视制作&#xff0c;从广告设计到智能客服&#xff0c;AIGC 技术的应用越来越广泛。通义万相 2.1 作为一…...

【AIGC实战】蓝耘元生代部署通义万相2.1文生图,结尾附上提示词合集

文章目录 &#x1f44f;什么是文生图&#xff1f;&#x1f44f;通义万相2.1文生图&#x1f44f;蓝耘元生代部署通义万相2.1&#x1f44f;平台注册&#x1f44f;部署通义万相2.1&#x1f44f;使用通义万相2.1文生图 &#x1f44f;提示词合集&#x1f44f;总结 随着人工智能生成内…...

Gartner:数据安全平台DSP提升数据流转及使用安全

2025 年 1 月 7 日&#xff0c;Gartner 发布“China Context&#xff1a;Market Guide for Data Security Platforms”&#xff08;《数据安全平台市场指南——中国篇》&#xff0c;以下简称指南&#xff09;&#xff0c;报告主要聚焦中国数据安全平台&#xff08;Data Securit…...

数据结构与算法:双指针

前言 双指针其实和滑动窗口差不多&#xff0c;但能使用的场景比滑动窗口更广功能更强。滑动窗口的内容在我上一篇文章数据结构与算法&#xff1a;滑动窗口。 一、原理 双指针的关键还是分析题目单调性&#xff0c;从而保证指针可以单方向滑动。 二、题目 1.按奇偶排序数组…...

Leetcode 57: 插入区间

Leetcode 57: 插入区间 问题描述&#xff1a; 给定一个非重叠的区间集合 intervals&#xff08;按开始时间升序排列&#xff09;和一个新的区间 newInterval&#xff0c;将新的区间插入到区间集合中并合并重叠的部分&#xff0c;最后返回结果区间集合。 适合面试的解法&#x…...

NLP如何训练AI模型以理解知识

一、自然语言处理&#xff08;NLP&#xff09;的定义与核心目标 1. 什么是自然语言处理&#xff1f; NLP是计算机科学与人工智能的交叉领域&#xff0c;旨在让机器具备以下能力&#xff1a; • 理解&#xff1a;解析人类语言&#xff08;文本或语音&#xff09;的语法、语义和…...

android13为账号密码做文件存储功能

注册获取外存权限 <uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE" />申请文件存入外存权限 // Activity中 // 1. 申请PackageManag…...

Excel的行高、列宽单位不统一?还是LaTeX靠谱

想要生成田字格、米字格、带拼音标准&#xff0c;方便小学生书法和练字。Word&#xff0c;Excel之类所见即所得是最容易相当的方式。但它们处理带田字格之类背景时&#xff0c;如果没有专用模板、奇奇怪怪的插件&#xff0c;使用起来会碰到各种问题。比如&#xff0c;Word里面用…...

【JavaSE-5】程序逻辑控制相关练习题

1、判断一个数字是否是素数(质数) //方法1&#xff1a; import java.util.Scanner; public static void main(String[] args) {//判断一个数字是否是素数:除了1和它本身外没有其他数可以整除Scanner scan new Scanner(System.in);int num scan.nextInt();boolean flag tru…...

MyBatis-Plus 条件构造器的使用(左匹配查询)

在上一篇文章中&#xff0c;我们已经介绍了 MyBatis-Plus 条件构造器&#xff0c;包括 QueryWrapper 和 UpdateWrapper 的基本使用方法、常见查询条件&#xff08;如等于、不等于、大于、小于&#xff09;以及如何使用 Lambda 表达式来构建动态查询和更新条件。 在本文中&…...

深入理解设计模式中的单例模式(Singleton Pattern)

各类资料学习下载合集 https://pan.quark.cn/s/8c91ccb5a474 单例模式是一种创建型设计模式&#xff0c;确保一个类只有一个实例&#xff0c;并提供全局访问点。这种模式在许多应用场景中都很有用&#xff0c;特别是当我们希望控制对共享资源的访问时&#xff0c;比…...

CES Asia 2025增设未来办公教育板块,科技变革再掀高潮

作为亚洲消费电子领域一年一度的行业盛会&#xff0c;CES Asia 2025&#xff08;第七届亚洲消费电子技术贸易展&#xff09;即将盛大启幕。今年展会规模再度升级&#xff0c;预计将吸引超过500家全球展商参展&#xff0c;专业观众人数有望突破10万。除了聚焦人工智能、物联网、…...

汽车零部件厂如何选择最适合的安灯系统解决方案

在现代制造业中&#xff0c;安灯系统作为一种重要的生产管理工具&#xff0c;能够有效提升生产线的异常处理效率&#xff0c;确保生产过程的顺畅进行。对于汽车零部件厂来说&#xff0c;选择一套适合自身生产需求的安灯系统解决方案尤为重要。 一、安灯系统的核心功能 安灯系统…...

sqlite3 c++ client选择; c++环境搭建 : abseil-cpp | fnc12/sqlite_orm

sqlite3 c client选择 今日20250305 2.4K星: 7月前最后提交核心: SRombauts/SQLiteCpp.git : 薄封装、命令式sql、非orm、支持事务2.4K星: 1月前最后提交核心: fnc12/sqlite_orm.git : 厚封装、非侵入、真orm、真泛型、类型复杂、支持事务 因真泛型导致DbInstance必须放在x.h…...

Pytorch中的主要函数

目录 一、torch.manual_seed(seed)二、torch.cuda.manual_seed(seed)三、torch.rand(*size, outNone, dtypeNone, layouttorch.strided, deviceNone, requires_gradFalse)四、给大家写一个常用的自动选择电脑cuda 或者cpu 的小技巧五、torch.version.cuda&#xff1b;torch.bac…...

景联文科技:以专业标注赋能AI未来,驱动智能时代的精准跃迁

在人工智能技术重塑全球产业格局的今天&#xff0c;高质量训练数据已成为驱动算法进化的核心燃料。作为数据智能服务领域的领军者&#xff0c;景联文科技深耕数据标注行业多年&#xff0c;以全栈式数据解决方案为核心&#xff0c;构建起覆盖数据采集、清洗、标注、质检及算法调…...

车载测试:智能座舱测试中多屏联动与语音交互的挑战

智能座舱作为汽车智能化发展的核心&#xff0c;集成了多屏联动和语音交互功能&#xff0c;为驾驶员和乘客提供更便捷的体验。然而&#xff0c;这些功能的测试面临诸多挑战&#xff0c;包括多屏同步性、噪声干扰和复杂场景的处理。本文将详细分析这些挑战&#xff0c;探讨测试方…...

深入探索WebGL:解锁网页3D图形的无限可能

深入探索WebGL&#xff1a;解锁网页3D图形的无限可能 引言 。WebGL&#xff0c;作为这一变革中的重要技术&#xff0c;正以其强大的功能和广泛的应用前景&#xff0c;吸引着越来越多的开发者和设计师的关注。本文将深入剖析WebGL的核心原理、关键技术、实践应用&#xff0c;并…...

仿mudou库one thread oneloop式并发服务器

项目gitee&#xff1a;仿muduo: 仿muduo 一&#xff1a;项目目的 1.1项目简介 通过咱们实现的⾼并发服务器组件&#xff0c;可以简洁快速的完成⼀个⾼性能的服务器搭建。 并且&#xff0c;通过组件内提供的不同应⽤层协议⽀持&#xff0c;也可以快速完成⼀个⾼性能应⽤服务器…...

Linux 文件和目录权限管理详解

文章目录 Linux 文件和目录权限管理详解介绍权限管理的核心内容权限管理访问权限查看权限更改权限所有者和用户组的设置权限设置注意事项 总结 Linux 文件和目录权限管理详解 介绍 在 Linux 系统中&#xff0c;文件和目录的权限管理是确保系统安全的重要组成部分。每个文件和…...

CentOS 7 aarch64上制作kernel rpm二进制包 —— 筑梦之路

环境说明 centos 7 aarch64 gcc 8.3.1 kernel 5.4.290 准备编译制作 # 安装必要的工具和包yum install rpm-devel rpmdevtools yum groupinstall "Development Tools"yum install ncurses-devel bc elfutils-libelf-devel openssl-devel # 安装gcc 8.3.1# 修改…...