题目链接
先考虑不能交换,怎么找最长的单字母子串。
用一个窗口作为辅助寻找最长的单字母子串(满足要求的子串一定会被窗口划过)
1.遇到窗口里面相同的字符时,看做窗口变大。
2.遇到窗口里面不同的字符时,看做窗口右移。
由于题目可以交换一个字符,那么窗口的大小要放大一个单位。
char[] word = text.toCharArray();
int[] winCount = new int[26];
int[] charCount = new int[26];
for (char c : word)
charCount[c - 'a']++;
int maxChar = 0;
int start = 0, maxWin = 0, maxCount = 0;
for (int i = 0; i < word.length; i++) {
int c = word[i] - 'a';
winCount[c]++;// 增加新字符的数量
if (winCount[c] > maxCount) {
// 是当前计数最多的字符,扩大窗口容量
maxChar = c;
maxCount = winCount[c];
maxWin = maxCount + 1;// 窗口大小比最多的字符多一个,因为可以放一个不同的字符
} else if (i - start + 1 > maxWin) {
// 不是当前计数最多的字符,压缩窗口
winCount[word[start] - 'a']--;
start++;
}
}
return Math.min(maxWin, charCount[maxChar]);//字符时交换的,最多不能超过每个字符的count
```