Skip to content

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)

链接

3090 国际版

3090 中文版