1156. 单字符重复子串的最大长度
参考评论区的解答。
class Solution {
public int maxRepOpt1(String text) {
if (text == null || text.length() == 0) {
return 0;
}
char[] chs = text.toCharArray();
int[] cnt = new int[26];
for (char c : chs) {
cnt[c - 'a']++;
}
char currChar = chs[0];
int currCharCnt = 1;
int length = chs.length;
int ans = 1;
//结合具体例子,画画图,按照流程走一遍,很好理解。
for (int i = 1; i < length; i++) {
if (chs[i] == currChar) {
currCharCnt++;
} else {//检查到不相等的字符
int idxSecond = i + 1;//向后统计currchar。
//若这个while能中,说明是能连在一起的,比如 aaaabaaadfesaa
//这的aaabaaa就可以连在一起,因为中间就隔着一个字符b
//while不中,说明不能连在一起,因为只能交换一次,比如aaaabbbaaadfesaa
//aaaabbbaaa 这些a是无法连在一起的。
while (idxSecond < length && chs[idxSecond] == currChar) {
idxSecond++;
currCharCnt++;
}
//小while结束后,判断。统计和总数比较,若小于总数还可以 + 1,即让其他地方多余的currchar换过来,就又增加了1个。看上面的例子就能明白了。
if (cnt[currChar - 'a'] > currCharCnt) {
currCharCnt++;
}
//更新答案
ans = Math.max(ans, currCharCnt);
//更新答案后,更新currChar。因为首次进入循环时,currChar是chs[0]。其实是在枚举currChar,每个currChar都统计一遍与自己同字符的最大长度。你可能觉得枚举太垃圾了,但是你想想,当字符种类多的时候,就得这样。
currChar = chs[i];
//更新统计变量
currCharCnt = 1;
}
}
//i=1时,结算的currChar是chs[0],所以,i=n-1时,结算的currChar是chs[n-2],所以循环结束后,要单独结算一下currChar是chs[n-1]的情况。 关注上面代码的后三句。
if (cnt[currChar - 'a'] > currCharCnt) {
currCharCnt++;
}
ans = Math.max(ans, currCharCnt);
return ans;
}
}