3090.每个字符最多出现两次的最长子字符串:二重循环 / 滑动窗口
【LetMeFly】3090.每个字符最多出现两次的最长子字符串:二重循环 / 滑动窗口
力扣题目链接:https://leetcode.cn/problems/maximum-length-substring-with-two-occurrences/
给你一个字符串 s ,请找出满足每个字符最多出现两次的最长子字符串,并返回该子字符串的 最大 长度。
示例 1:
输入: s = "bcbbbcba"
输出: 4
解释:
以下子字符串长度为 4,并且每个字符最多出现两次:"bcbbbcba"。
示例 2:
输入: s = "aaaa"
输出: 2
解释:
以下子字符串长度为 2,并且每个字符最多出现两次:"aaaa"。
提示:
2 <= s.length <= 100s仅由小写英文字母组成。
解题方法一:二重循环模拟
第一重循环枚举子字符串起点,第二重循环枚举子字符串终点,并在二重循环期间维护子串中每个字符的出现次数,若有字符出现次数超过两次则结束二重循环,否则更新答案最大值。
- 时间复杂度$O(len(s)^2\times C)$,其中$C=26$
- 空间复杂度$O(C)$
AC代码
C++
1 | |
解题方法二:滑动窗口
左右两个指针$l$、$r$始终维护以$r$为终点时的最大合法子字符串。每次$r$指针右移一位,若新字符出现次数超过$2$次,则不断右移$l$指针直至子字符串再次合法。
- 时间复杂度$O(len(s))$,可以只关注新加入窗口的这一个字符是否超过2次,从而无需有$O(C)$的复杂度
- 空间复杂度$O(C)$,其中$C=26$
AC代码
C++
1 | |
- 执行用时分布 0 ms 击败 100.00%
- 消耗内存分布 8.82 MB 击败 98.10%
Python
1 | |
同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~
千篇源码题解已开源
3090.每个字符最多出现两次的最长子字符串:二重循环 / 滑动窗口
https://blog.letmefly.xyz/2026/08/14/LeetCode 3090.每个字符最多出现两次的最长子字符串/