LeetCode 第3题《无重复字符的最长子串》笔记
📅 2026/7/23 4:51:57
👁️ 次浏览
一、题目回顾题目给定一个字符串s找出其中不含有重复字符的最长子串的长度。示例输入s abcabcbb输出3解释因为无重复字符的最长子串是abc所以长度为 3。提示0 s.length 5 * 10^4s由英文字母、数字、符号和空格组成二、核心知识点知识点1滑动窗口的核心思想滑动窗口是处理子串问题的经典方法用两个指针左、右维护一个动态窗口。右指针 (right)负责向右扩展将新字符加入窗口。左指针 (left)负责在发现重复时将窗口左侧收缩到重复字符之后。核心目标始终保证窗口内所有字符不重复并记录窗口长度的最大值。形象理解想象一个可以伸缩的“窗口”在字符串上滑动右边界不断尝试扩大左边界在遇到重复时向右收缩。知识点2关键数据结构last_pos数组作用快速查询一个字符是否在窗口内以及它上一次出现的位置。定义int last_pos[128];存储逻辑下标字符的 ASCII 码值例如a的 ASCII 码是 97。值该字符最后一次出现的位置索引。初始值设为-1表示该字符从未出现。为何固定128足以覆盖所有标准 ASCII 字符空间开销极小512字节。图解存储结构字符: a b c d e ... z ASCII: 97 98 99 100 101 ... 122 last_pos数组 索引: 0 1 2 ... 97 98 99 100 ... 127 [ ][ ][ ] [3 ][5 ][2 ][-1 ] [ ] 不 不 不 a b c d 用 用 用 的 的 的 的 值 值 值 值知识点3核心判断逻辑last_pos[ch] left问题为什么这一句就能判断字符ch是否重复解答它判断的是字符ch上一次出现的位置是否在当前窗口内。last_pos[ch]字符ch上一次出现的位置。left当前窗口的左边界。当前窗口范围是[left, right]。判断逻辑若last_pos[ch] left→ 该字符的上次出现位置在窗口内 →重复若last_pos[ch] left→ 该字符的上次出现位置已被移出窗口 →不重复可以安全加入。图解三种情况情况1字符在窗口内重复字符串: a b c a b 索引: 0 1 2 3 4 [窗口] left1, right3 要加入 right4 的 b last_pos[b] 1 (在索引1) 判断1 left(1)? 是✅ → 重复了情况2字符不在窗口内不重复字符串: a b c a b 索引: 0 1 2 3 4 [窗口] left2, right3 要加入 right4 的 b last_pos[b] 1 (在索引1) 判断1 left(2)? 否❌ → 没重复知识点4窗口滑动操作处理重复的步骤当遇到重复字符ch时执行以下三步移动左指针left last_pos[ch] 1;直接跳到重复字符的下一个位置保证新窗口无重复。更新位置last_pos[ch] right;将ch的最新位置更新为当前位置。更新最大长度max_len max(max_len, right - left 1);图解执行过程以s abcabcbb为例第4步right3, cha, last_pos[a]0, left0 发现重复left从0跳到1 窗口从 [a,b,c] 变为 [b,c,a] 第5步right4, chb, last_pos[b]1, left1 发现重复left从1跳到2 窗口从 [b,c,a] 变为 [c,a,b]知识点5为什么你的初步想法需要修正你的初步想法“从第一个开始遇到重复就截止然后从这个重复出现的最后一个开始接着计数。”问题与修正这个想法接近滑动窗口但移动方式有误。不应从“重复的最后一个”开始而应从重复字符第一次出现位置的下一个位置开始即left last_pos[ch] 1。这样才能保证新窗口内不再包含重复字符。举例说明s abca 正确做法遇到第二个a时left从0跳到1窗口变为 [b,c,a] 你的做法从第二个a开始窗口为 [a]漏掉了 [b,c,a]三、常见错误总结错误1只检查相邻字符错误写法if (s[i] s[i-1])问题分析只能发现像aa这种紧挨着的重复无法发现abca中相距较远的重复字符a。正确做法必须用last_pos数组检查所有出现过的字符判断其是否在当前窗口内。错误2左指针移动方式错误错误写法left;一次只移动一位问题分析窗口内可能仍然存在其他重复字符效率低且容易出错。例如abcb中遇到第二个b时left应跳到2而不是1。正确做法应直接跳跃到重复字符的下一个位置left last_pos[ch] 1;错误3获取字符串长度方式错误错误写法int len sizeof(s);问题分析当s是函数参数指针时sizeof(s)获取的是指针本身的大小在64位系统上是8字节而不是字符串长度。正确做法使用int len strlen(s);需要包含#include string.h。错误4last_pos数组未初始化错误写法int last_pos[128];直接使用问题分析数组初始值为随机值内存中的垃圾数据会导致last_pos[ch]判断错误程序行为不可预测。正确做法必须将所有元素初始化为-1表示所有字符都未出现。可以用循环或memset(last_pos, -1, sizeof(last_pos));。四、完整解题模板int lengthOfLongestSubstring(char* s) { int len strlen(s); //计算字符串长度 if (len 0) return 0; int left 0; int max_len 0; int last_pos[128]; // 128个位置对应128个ASCII字符 // 初始化为-1 for (int i 0; i 128; i) { last_pos[i] -1; } //滑动窗口主程序 for (int right 0; right len; right) { char ch s[right]; //判断重复并移动左指针 if (last_pos[ch] left) { left last_pos[ch] 1; } //更新位置和最大长度 last_pos[ch] right; int cur_len right - left 1; if (cur_len max_len) { max_len cur_len; } } return max_len; }代码要点last_pos数组大小固定为128适用于所有ASCII字符。左指针left只向右移动从不回退保证了 O(n) 的时间复杂度。每次循环都更新max_len确保记录历史最大值。五、复杂度分析项目复杂度说明时间复杂度O(n)其中n是字符串长度。每个字符最多被右指针访问一次被左指针访问一次当它被移出窗口时。所有操作数组读写、比较均为 O(1)。空间复杂度O(1)last_pos数组大小固定为128与输入字符串长度无关。只使用了常数个额外变量left,max_len,right等。
1. 项目概述:为什么vector的容量管理是C性能优化的关键在C的日常开发中,std::vector无疑是使用频率最高的STL容器,没有之一。它提供了动态数组的便利,但这份便利背后,隐藏着一个新手和老手性能差距巨大的关键点——内存…
📅 2026/7/23 4:51:57
1. 项目概述:为什么我们需要一个异步命令引擎在C后端开发里,处理用户请求、执行复杂业务逻辑或者响应系统事件时,我们常常会碰到一个经典难题:如何让代码既保持清晰的逻辑结构,又能高效、非阻塞地处理任务?…
📅 2026/7/23 4:51:57
1. 项目概述:为什么我们需要一个自己的Web自动化测试框架?如果你是一名测试工程师,或者正在向这个方向转型,那么“自动化测试”这个词对你来说一定不陌生。尤其是在Web应用开发迭代速度越来越快的今天,纯靠手工点击来保…
📅 2026/7/23 4:50:57
1. Lambda表达式参数问题:从新手困惑到高手精通的深度解析如果你在写C时,尤其是用上了C11及之后的现代特性,Lambda表达式绝对是你绕不开的一个“甜蜜的烦恼”。它简洁、强大,能把函数对象写得像内联代码一样优雅,但一旦…
📅 2026/7/23 6:09:19
24GB显卡玩转70B大模型:GPTQ/AWQ/GGUF量化方案踩坑全记录
为什么消费级显卡也能跑70B模型?
在2023年之前,运行70B参数的大模型需要专业级GPU集群,但如今借助量化技术,消费级显卡也能胜任。上周我在配备RTX 3090&…
📅 2026/7/23 6:09:19
1. 芯片概览与核心定位在嵌入式开发领域,选型往往决定了项目的天花板。当你面对一个需要网络连接、实时控制、复杂算法处理,并且对成本与功耗有严格要求的项目时,一款集高性能内核与丰富外设于一身的微控制器(MCU)就成…
📅 2026/7/23 6:09:19
第一章 应急响应-Linux日志分析问题:1.有多少IP在爆破主机ssh的root帐号,如果有多个使用","分割 小到大排序 例如flag{192.168.200.1,192.168.200.2}2.ssh爆破成功登陆的IP是多少,如果有多个使用","分割3.爆破用户名字典…
📅 2026/7/23 6:09:19
很多新手刚接触直播中控时,会以为中控的主要工作只是上链接、看评论、发优惠券、配合主播节奏。
但真正进入直播间后会发现,一场直播能不能顺利开起来,和前期配置关系很大。
摄像头是否清晰、麦克风是否稳定、网络是否流畅、推流参数是否合…
📅 2026/7/23 6:09:19
内容:
那天凌晨三点,我盯着镜子里那张脸,真的想给自己两巴掌。
脸色黄得像被烟熏过,毛孔大得能插秧。
前一天晚上为了赶那个破方案,咖啡当水喝,外卖当饭吃。
第二天早上起来,妆都卡粉卡到怀疑人生。
真的,那种绝望感,谁懂啊?
以前我总觉得,隔离霜嘛,随便买个大牌子涂…
📅 2026/7/23 6:08:31
更多请点击:
https://intelliparadigm.com
第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…
📅 2026/7/23 0:00:26
最近好多同行在群里问 geo s1230 到底值不值得买。说实话,这机器在二手市场挺火。但水很深,新手很容易踩雷。我干了十年设备维护,见过太多冤大头。今天不扯虚的,直接上干货。先说价格,心里得有底。目前成色不错的二手货,大概在一万二到一万五之间。如果低于八千,别犹豫,…
📅 2026/7/23 0:01:16
更多请点击:
https://codechina.net
第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现࿱…
📅 2026/7/23 0:01:26
1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…
📅 2026/7/23 1:06:38
1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…
📅 2026/7/23 1:06:38
更多请点击:
https://intelliparadigm.com
第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…
📅 2026/7/23 1:06:38
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/22 7:05:39
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/22 17:06:14
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/23 5:06:50