如果字符串中的所有字符都相同,那么这个字符串是单字符重复的字符串。
给你一个字符串 text,你只能交换其中两个字符一次或者什么都不做,然后得到一些单字符重复的子串。返回其中最长的子串的长度。
题目链接:https://leetcode.cn/problems/swap-for-longest-repeated-character-substring/
# 解题思路
滑动窗口:
- 找到与当前遍历的字符相同的最长的一段 
[i, j) - 判断当前短能否通过交换一次变得更长,即当 
cnt[chs[i] - 'a'] > j - i && (i > 0 || j < n)时,则能长度加 1 - 找到这一段后面与之【相隔一个不同字符】的另一段 
[j+1, k),最大长度 = min(k - i, cnt[chs[i] - 'a']) 
# 执行结果

# 代码
class Solution {  | |
public int maxRepOpt1(String text) {  | |
char[] chs = text.toCharArray();  | |
int n = chs.length;  | |
int[] cnt = new int[26];  | |
        // 记录每个字符出现的次数 | |
for (char c : chs) ++cnt[c - 'a'];  | |
int ret = 0;  | |
int i = 0;  | |
while (i < n) {  | |
            // 找出当前相同字符的一段 [i, j) | |
int j = i;  | |
while (j < n && chs[j] == chs[i]) ++j;  | |
            // 当前这一段连续相同的字符串的长度 | |
int len = j - i;  | |
            //len < 该字符出现的总数,并且前面或后面有空位,则可以替换,即长度为 len+1 | |
if (len < cnt[chs[i] - 'a'] && (j < n || i > 0))  | |
ret = Math.max(ret, len + 1);  | |
            // 找到这一段后面与之【相隔一个不同字符】的另一段 [j+1, k) | |
int k = j + 1;  | |
while (k < n && chs[k] == chs[i]) ++k;  | |
            // 最大长度不会超过该字符出现的总次数 | |
ret = Math.max(ret, Math.min(k - i, cnt[chs[i] - 'a']));  | |
            // 更新 i | |
i = j;  | |
        } | |
return ret;  | |
    } | |
} |