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;
}
};
分类:
Leetcode
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】