每个字符最多出现两次的最长子字符串-LeetCode
3090. 每个字符最多出现两次的最长子字符串
🎯 问题描述(来源于LeetCode)
描述:
给你一个字符串 s,请找出满足每个字符最多出现两次的最长子字符串,并返回该子字符串的最大长度。
说明:
-
子字符串:字符串中一段连续非空的字符序列。
-
核心逻辑:使用滑动窗口维护一个“每个字符出现次数不超过 2 次”的区间。当某个字符出现次数达到 3 次时,收缩左边界,直到该字符次数恢复为 2 次。
-
示例:
-
示例 1:
1 | 输入: s = "bcbbbcba" |
- 示例 2:
1 | 输入:s = "aaaa" |
💻 解题思路
思路1:不定长滑动窗口
思路1:代码实现
1 | class Solution: |
思路1:📊 性能分析
- 时间复杂度:
- 其中 是字符串
s的长度。 - 虽然代码中有一个
while循环嵌套在for循环中,但每个字符最多被访问两次(一次被右边界right加入,一次被左边界left移出)。因此,整体操作次数是线性的。
- 其中 是字符串
- 空间复杂度:
- 哈希表
cnt最多存储 26 个小写英文字母的计数,这是一个常数空间。
- 哈希表
思考
-
**与无重复字符的最长子串**的区别:
- 无重复字符的最长子串要求每个字符出现次数 。
- 本题要求每个字符出现次数 。
- 代码逻辑几乎完全相同,只是将判断条件从
cnt[c] > 1改为了cnt[c] > 2。
-
滑动窗口的通用性:
- 这种不定长滑动窗口的模板非常通用,可以解决很多“满足某种条件的最长/最短子数组/子串”问题。
- 核心在于维护一个合法的窗口,并在窗口不合法时收缩左边界。
-
答案更新:
ans = max(ans, right - left + 1)放在while循环之后,确保只在窗口合法时更新答案。- 此时窗口
[left, right]内的所有字符出现次数都不超过 2 次,满足题目要求。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 笺札!






