没问题我已经把原题内容、示例分析以及题目限制条件都补进去了。这样这份笔记就变成了一个完全闭环的刷题档案以后复习看这一篇就全懂了 LeetCode 3090 算法与 C 基础学习笔记 题目复盘1. 题目描述给你一个字符串s请你找出满足每个字符最多出现两次的最长子字符串并返回该子字符串的最大长度。2. 示例剖析示例 1输入s bcbbbcba输出4解释满足条件的最长子字符串是bcba长度为 4在这个子串中b出现了 2 次c出现了 1 次a出现了 1 次没有任何字符超过 2 次。如果取bcbbb长度虽然是 5但b出现了 4 次不合法。示例 2输入s aaaa输出2解释满足条件的最长子字符串是aa长度为 2。因为一旦到第三个a数量就变成 3 溢出了。3. 提示与数据范围2≤s.length≤1002 \le \text{s.length} \le 1002≤s.length≤100数据量很小说明算法只要方向正确绝对不会超时。s仅由小写英文字母组成核心考点提示意味着字符种类固定只有 26 个。 核心算法滑动窗口 (Sliding Window)1. 适用场景当题目要求在字符串或数组中寻找“最长/最短的连续子区间”且区间满足某种“限制条件”时首选滑动窗口。2. 核心双指针逻辑滑动窗口利用left左指针和right右指针来控制区间的边界窗口扩张right指针不断向右移动将新元素纳入当前窗口并更新状态如计数器。窗口收缩当新元素加入导致窗口违反限制条件时保持right不动不断将left指针向右移动并扣减状态直到窗口重新合法。结果更新在窗口合法的任意时刻当前窗口的长度为right - left 1。️ C 核心语法与工具箱1. 字符映射小技巧哈希思想当题目限制字符仅为“小写英文字母”时不需要使用复杂的哈希表直接用大小为 26 的整型数组效率最高。映射原理利用 ASCII 码的连续性将字符转换为0-25的数组下标。核心公式int b s[right] - a;如果s[right]是a则a - a 0对应数组第 0 个格子如果s[right]是b则b - a 1对应数组第 1 个格子2. 数组的初始化方式从新手到高手在 C 中局部数组如果不手动初始化里面会充满随机的垃圾数据。以下是三种完全等价的初始化方式高级简写版intcnt[26]{};// C11 列表初始化大括号留空代表全部填 0传统清晰版推荐初学者使用可读性好intcnt[26]{0};// 显式赋值一眼就能看懂全部初始化为 0动态数组版现代 C 标准写法vectorintcnt(26,0);// 创建大小为 26 的 vector默认值全为 0 什么是vector动态数组vector是 C 标准库STL中最常用的容器之一它解决了传统数组“大小固定死、无法改变”的痛点。1. 核心特点智能变长它像一个可以自动伸缩的抽屉你可以随时往里面添加新数据使用push_back()它会自动扩容。安全方便自带很多功能函数如.size()获取长度比传统内存块更安全不容易发生越界崩溃。用法一致虽然是动态的但读取数据时依然支持和传统数组一样的方括号语法如cnt[i]。2. 语法拆解vectorintcnt(26,0);// ▲ ▲ ▲ ▲ ▲// 容器名 类型 变量名 初始大小 初始默认值 本题最优解代码模板结合上述笔记最地道、可读性最好的 C 解法如下classSolution{public:intmaximumLengthSubstring(string s){intans0;intleft0;vectorintcnt(26,0);// 使用 vector 初始化 26 个小写字母的计数器for(intright0;rights.length();right){intbs[right]-a;// 将字符转化为 0-25 的索引cnt[b];// 窗口扩张新字符计数加 1// 窗口收缩如果当前字符超过 2 次左边界右移直到恢复合法while(cnt[b]2){cnt[s[left]-a]--;left;}// 此时窗口必定合法更新历史最长子串长度ansmax(ans,right-left1);}returnans;}};时间复杂度O(N)O(N)O(N)尽管内层有while循环但left和right指针各自最多都只把字符串从头到尾走了一遍因此整体是线性的。空间复杂度O(1)O(1)O(1)只开辟了大小为 26 的固定辅助空间与输入字符串s的长度无关。