Leetcode 1156. 单字符重复子串的最大长度

题目:

如果字符串中的所有字符都相同,那么这个字符串是单字符重复的字符串。
给你一个字符串 text,你只能交换其中两个字符一次或者什么都不做,然后得到一些单字符重复的子串。返回其中最长的子串的长度。

难度:中等

示例1:

输入:text = "ababa"
输出:3

示例2:

输入:text = "aaabaaa"
输出:6

示例3:

输入:text = "aaabbaaa"
输出:4

示例4:

输入:text = "aaaaa"
输出:5

示例5:

输入:text = "abcdef"
输出:1

提示:

  • 1 <= text.length <= 20000
  • text 仅由小写英文字母组成。

代码实现:

class Solution {
public:
    int maxRepOpt1(string text) {
        int n = text.size();
        unordered_map<char, int> hash; // 统计字符数量
        for(auto c : text) ++hash[c];

        int maxlen = 0; // 存结果
        int cnt[n], idx = -1;    // 将 aaabbaa 处理为 (a, 3) (b, 2) (a, 2)的形式

        for(int i = 0; i < n; ++i){
            // 统计连续字符
            int j = i;
            while(j < n && text[j] == text[i]) ++j;     // 统计到连续字符的下一个

            cnt[++idx] = j - i;    // 统计以text[i]开始的连续字符长度;

            // 判断存在两个相同子串 且 中间间隔一个不同字符
            if(idx > 1 && cnt[idx - 1] == 1 && i > 1 && text[i - 2] == text[i]){
                maxlen = max(maxlen, min(cnt[idx] + cnt[idx - 2] + 1, hash[text[i]]));
            }
            maxlen = max(maxlen, min(cnt[idx] + 1, hash[text[i]]));     // 其他情况时,小于总数则+1;
            i = j - 1;  // 直接扫描下一个不同字符
        }
        return maxlen;
    }
};
posted @   DL1024  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示