3090. 每个字符最多出现两次的最长子字符串 Easy
给你一个字符串 s ,请找出满足每个字符最多出现两次的最长子字符串,并返回该子字符串的 最大 长度。
示例 1:
输入: s = "bcbbbcba"
输出: 4
解释:
以下子字符串长度为 4,并且每个字符最多出现两次:"bcbbbcba"。
示例 2:
输入: s = "aaaa"
输出: 2
解释:
以下子字符串长度为 2,并且每个字符最多出现两次:"aaaa"。
解题思路
输入:一个字符串 s
输出:返回一个子字符串的最大长度,要求其中每个字符最多出现两次
本题属于可变长度滑动窗口类型问题。
我们使用两个指针(left 和 right)来维护一个滑动窗口,并通过一个哈希表记录窗口中每个字符的出现次数。每次右指针向右扩展窗口时,将新字符加入计数器;如果某个字符的出现次数超过 2,就不断移动左指针缩小窗口,直到该字符的频率降至不超过 2。
在窗口合法的前提下,实时更新满足条件的最大子串长度,最终返回最大值即可。
代码实现
python
class Solution:
def maximumLengthSubstring(self, s: str) -> int:
freq_map = {} # 记录窗口内每个字符出现的频率
left = 0 # 滑动窗口左边界
max_len = 0 # 记录最长合法子串长度
for right in range(len(s)):
char = s[right]
freq_map[char] = freq_map.get(char, 0) + 1 # 加入新字符到窗口
# 如果某个字符出现次数超过 2,移动左指针收缩窗口
while freq_map[char] > 2:
freq_map[s[left]] -= 1
left += 1
# 更新最大长度
max_len = max(max_len, right - left + 1)
return max_len # 返回满足条件的最长子串长度
复杂度分析
时间复杂度:O(n)
空间复杂度:O(1)