【leetcode复健-6】无重复字符的最长字串-滑动窗口的运用
3. 无重复字符的最长子串 - 力扣LeetCode摘要本文我将分享解决「无重复字符的最长子串」这道力扣题目的核心思路。我会重点讲解滑动窗口与哈希字典的结合使用并剖析一个关键陷阱遇到重复字符时不应丢弃整个当前子串而应巧妙地更新窗口左边界。通过变量x记录无效字符边界我们可以在一次遍历中高效求解。文末提供了可直接运行的 Python 代码实现。给定一个字符串s请你找出其中不含有重复字符的最长 子串的长度。示例 1:输入: s abcabcbb 输出: 3 解释: 因为无重复字符的最长子串是 abc所以其长度为 3。 注意 bca 和 cab 也是正确答案。示例 2:输入: s bbbbb 输出: 1 解释: 因为无重复字符的最长子串是 b所以其长度为 1。示例 3:输入: s pwwkew 输出: 3 解释: 因为无重复字符的最长子串是 wke所以其长度为 3。 请注意你的答案必须是 子串 的长度 pwke 是一个子序列不是子串。正解class Solution: def lengthOfLongestSubstring(self, s: str) - int: hash1 {} max_len 0 cur_len 0 x -1 for i in range(len(s)): if s[i] not in hash1: hash1[s[i]] i cur_len 1 elif hash1[s[i]] x: hash1[s[i]] i cur_len 1 else: x hash1[s[i]] cur_len i - hash1[s[i]] hash1[s[i]] i max_len max(cur_len, max_len) return max_len坑点与要点这道题首先有两个要求1. 只要求给出最长字串的长度2. 字串中不含重复字符这道题最坑的地方在于当一个字串中出现重复字串时我们会下意识的把这段子串完全丢弃并从改字串的下一个字符开始寻找下一个字串。然而这是错的这么做会导致我们丢失一大段已经寻找到的无重复字符的子串。因此对于一个出现重复字符的子串来说重复的字母一定位于该字串的首尾位置此时我们应该只抛弃该字串的头字符并接续着往下继续寻找无重复字符的字串而不是整段抛弃。如下a s d f g h j k l a z x c v当前遍历发现第二个a最大长度9|| ||重复 发现重复截断第一个字符a新子串 s d f g h j k l a z x c v当前遍历到v最大长度13解答思路使用滑动窗口把视线聚焦于不重复的那一段子串中遇到重复的字符从被重复的字符右边开始继续统计字符长度这就要求我们需要知道重复字符的位置当前子串的长度变为两个重复字符的下标之差因此我们使用字典。key为字符value为下标这里需要额外注意一点我们使用字典记录所有已出现的字符会造成一个问题对于 a b c d c b这段字符串当我们遇到第二个c时字典中a, b, c这三个键值对都应该被舍弃避免影响后续哈希判断但是我们无法准确的丢弃这些字符且IO开销过大因此我们需要一个额外的变量 x 用于记录第一个 c 的下标判断重复时下标小于 x 的字母自动认为不存在字典中如此以来就完成了舍弃操作。代码思路如下# 一张hash1表 字典# 一个变量x记录被重复字符下标# 最大长度max_len, 当前长度cur_len# 遍历一次每次判断当前字母i是否存在于hash1中# 如果不在则按照 字符下标 的形式存入字典 cur_len 1# 如果在但是hash1[s[i]] x 1# 则同样则按照 字符下标 的形式存入字典 cur_len 1# 如果在则 cur_len i - hash1[s[i]]# hash1[s[i]] i# 每次遍历末尾更新max_len代码实现class Solution: def lengthOfLongestSubstring(self, s: str) - int: hash1 {} max_len 0 cur_len 0 x -1 for i in range(len(s)): if s[i] not in hash1: hash1[s[i]] i cur_len 1 elif hash1[s[i]] x: hash1[s[i]] i cur_len 1 else: x hash1[s[i]] cur_len i - hash1[s[i]] hash1[s[i]] i max_len max(cur_len, max_len) return max_len

相关新闻

AI预测可变剪接:从统计模型到基因组大模型的演进与实践指南

AI预测可变剪接:从统计模型到基因组大模型的演进与实践指南

1. 从统计模型到基因组大模型:一场预测范式的深刻变革如果你最近在关注基因组学,尤其是转录组和RNA剪接领域,那么“AI预测可变剪接”这个话题一定绕不开。从早期的隐马尔可夫模型(HMM)到如今动辄数十亿参数的基因组大模…

2026/8/2 4:48:13 阅读更多 →
CytoTRACE:基于基因表达多样性的单细胞分化潜能评估算法详解

CytoTRACE:基于基因表达多样性的单细胞分化潜能评估算法详解

1. 从细胞异质性到发育轨迹:为什么我们需要CytoTRACE?在单细胞转录组数据分析里,我们拿到手的往往是一个个细胞的基因表达矩阵。这些细胞看起来是“一锅粥”,但实际上,它们可能处于不同的分化阶段、不同的细胞周期&…

2026/8/2 4:48:13 阅读更多 →
Unity口型动画实战:从LipSync原理到SALSA插件高效配置

Unity口型动画实战:从LipSync原理到SALSA插件高效配置

1. 项目概述:为什么需要专业的口型动画方案?在Unity中制作角色对话动画,尤其是口型同步,长期以来都是让开发者头疼的环节。早期很多项目要么采用手动K帧,一个音节一个音节地去调整嘴型,耗时耗力且效果生硬&…

2026/8/2 4:48:13 阅读更多 →

最新新闻

如何用Python实现95%成功率的大麦抢票自动化解决方案

如何用Python实现95%成功率的大麦抢票自动化解决方案

如何用Python实现95%成功率的大麦抢票自动化解决方案 【免费下载链接】ticket-purchase 大麦自动抢票,支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 还在为热门演唱会门票秒光而烦恼吗&#xff1f…

2026/8/2 6:07:46 阅读更多 →
彻底解决Java日志SLF4J绑定失败:从原理到实战排查StaticLoggerBinder报错

彻底解决Java日志SLF4J绑定失败:从原理到实战排查StaticLoggerBinder报错

1. 项目概述:一个看似简单却困扰无数Java开发者的“经典”报错如果你是一个Java开发者,尤其是使用Spring Boot、Maven或Gradle构建项目的朋友,那么你对这个错误信息一定不会陌生:Failed to load class "org.slf4j.impl.Stati…

2026/8/2 6:07:46 阅读更多 →
Windows时间管理终极指南:用Tai轻松追踪你的每一分钟

Windows时间管理终极指南:用Tai轻松追踪你的每一分钟

Windows时间管理终极指南:用Tai轻松追踪你的每一分钟 【免费下载链接】Tai 👻 在Windows上统计软件使用时长和网站浏览时长 项目地址: https://gitcode.com/GitHub_Trending/ta/Tai 你是否经常在一天结束时感到困惑,不知道时间都去哪儿…

2026/8/2 6:07:46 阅读更多 →
IMX296全局快门传感器:从硬件设计到Linux驱动的工业相机实战

IMX296全局快门传感器:从硬件设计到Linux驱动的工业相机实战

1. 项目缘起:为什么是IMX296,为什么是全局快门最近在折腾一个机器视觉项目,需要捕捉高速运动物体的清晰图像。市面上常见的消费级摄像头,无论是手机上的还是网络摄像头,在拍静止画面时效果不错,但一旦物体动…

2026/8/2 6:07:46 阅读更多 →
SVGcode:开源位图转矢量图的现代化解决方案

SVGcode:开源位图转矢量图的现代化解决方案

SVGcode:开源位图转矢量图的现代化解决方案 【免费下载链接】SVGcode Convert color bitmap images to color SVG vector images. 项目地址: https://gitcode.com/gh_mirrors/sv/SVGcode SVGcode 是一个基于 Web 技术的开源工具,能够将 JPG、PNG、…

2026/8/2 6:07:46 阅读更多 →
Pareto前沿与NSGA-II在分子多目标优化中的原理与实践

Pareto前沿与NSGA-II在分子多目标优化中的原理与实践

1. 项目概述:当化学家遇上帕累托在药物研发、材料设计这些化学领域的核心战场,我们每天都在和“优化”这个词打交道。目标很明确:找到一个分子,它最好能同时满足“活性高”、“毒性低”、“合成容易”、“成本可控”等一堆要求。但…

2026/8/2 6:06:45 阅读更多 →

日新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/2 0:00:38 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/2 0:00:38 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/2 0:00:38 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/2 0:00:38 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/2 0:00:38 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/2 0:00:38 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/1 0:00:48 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/2 2:47:48 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/2 0:23:22 阅读更多 →