LeetCode 3090.每个字符最多出现两次的最长子字符串:二重循环 / 滑动窗口

【LetMeFly】3090.每个字符最多出现两次的最长子字符串:二重循环 / 滑动窗口

力扣题目链接:https://leetcode.cn/problems/maximum-length-substring-with-two-occurrences/

给你一个字符串 s ,请找出满足每个字符最多出现两次的最长子字符串,并返回该子字符串的最大长度。

示例 1:
输入: s = "bcbbbcba"

输出: 4

解释:

以下子字符串长度为 4,并且每个字符最多出现两次:"bcbb++bcba++"

示例 2:
输入: s = "aaaa"

输出: 2

解释:

以下子字符串长度为 2,并且每个字符最多出现两次:"++aa++aa"

提示:

  • 2 <= s.length <= 100
  • s 仅由小写英文字母组成。

解题方法一:二重循环模拟

第一重循环枚举子字符串起点,第二重循环枚举子字符串终点,并在二重循环期间维护子串中每个字符的出现次数,若有字符出现次数超过两次则结束二重循环,否则更新答案最大值。

  • 时间复杂度 O ( l e n ( s ) 2 × C ) O(len(s)^2\times C) O(len(s)2×C),其中 C = 26 C=26 C=26
  • 空间复杂度 O ( C ) O(C) O(C)

AC代码

C++
cpp 复制代码
/*
 * @LastEditTime: 2026-08-14 09:33:37
 */
class Solution {
private:
    bool ok(int cnt[26]) {
        for (int i = 0; i < 26; i++) {
            if (cnt[i] > 2) {
                return false;
            }
        }
        return true;
    }
public:
    int maximumLengthSubstring(string s) {
        int ans = 0;
        for (int i = 0, n = s.size(); i < n; i++) {
            int cnt[26] = {0};
            for (int j = i; j < n; j++) {
                cnt[s[j] - 'a']++;
                if (ok(cnt)) {
                    ans = max(ans, j - i + 1);
                } else {
                    break;
                }
            }
        }
        return ans;
    }
};

解题方法二:滑动窗口

左右两个指针 l l l、 r r r始终维护以 r r r为终点时的最大合法子字符串。每次 r r r指针右移一位,若新字符出现次数超过 2 2 2次,则不断右移 l l l指针直至子字符串再次合法。

  • 时间复杂度 O ( l e n ( s ) ) O(len(s)) O(len(s)),可以只关注新加入窗口的这一个字符是否超过2次,从而无需有 O ( C ) O(C) O(C)的复杂度
  • 空间复杂度 O ( C ) O(C) O(C),其中 C = 26 C=26 C=26

AC代码

C++
cpp 复制代码
/*
 * @LastEditTime: 2026-08-14 09:38:09
 */
class Solution {
public:
    int maximumLengthSubstring(string& s) {
        int ans = 0;
        int cnt[26] = {0};
        for (int l = 0, r = 0, n = s.size(); r < n; r++) {
            int th = s[r] - 'a';
            cnt[th]++;
            while (cnt[th] > 2) {
                cnt[s[l++] - 'a']--;
            }
            ans = max(ans, r - l + 1);
        }
        return ans;
    }
};
  • 执行用时分布 0 ms 击败 100.00%
  • 消耗内存分布 8.82 MB 击败 98.10%
Python
python 复制代码
'''
LastEditTime: 2026-08-14 09:44:21
'''
class Solution:
    def maximumLengthSubstring(self, s: str) -> int:
        ans = 0
        l = r = 0
        cnt = [0] * 26
        for r in range(len(s)):
            th = ord(s[r]) - 97
            cnt[th] += 1
            while cnt[th] > 2:
                cnt[ord(s[l]) - 97] -= 1
                l += 1
            ans = max(ans, r - l + 1)
        return ans

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

相关推荐
江畔柳前堤33 分钟前
前台·中台·后台:2026年AI原生时代的架构全景图
开发语言·人工智能·算法·机器学习·架构·scala·ai-native
文心快码BaiduComate1 小时前
2026 OPC x AI Coding 趋势案例交流会圆满落幕:一个人就一支研发团队
算法
ACM-moran1 小时前
条件显化(二分单峰函数+构造数列)
算法·推公式·整数三分
闻缺陷则喜何志丹2 小时前
【栈 运算系统】P3719 [AHOI2017初中组] rexp|普及+
c++·算法··洛谷·运算系统
疯狂打码的少年2 小时前
【数据库技术】多值依赖与第四范式(4NF)
数据库·笔记·算法
子文雨2 小时前
基于 uC3845 与 ATtiny13 双芯片架构的 8.4V/2.5Ah 锂电池智能充电器设计
单片机·嵌入式硬件·算法
青山木2 小时前
Hot 100 --- 数组中的第K个最大元素
java·数据结构·算法·排序算法
玛卡巴卡ldf2 小时前
【AICoding】笔试提示词设计思路
java·算法·ai编程
明月_清风2 小时前
位图与布隆过滤器:海量数据下的"存在性判断"艺术
前端·后端·算法
Rnan-prince2 小时前
堆与TopK · 从零到通透 —— 9 节全系列复盘
python·算法