题目:
给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次。在执行上述操作后,找到包含重复字母的最长子串的长度。
注意:
字符串长度 和 k 不会超过 104。
示例 1:
输入:
s = “ABAB”, k = 2
输出:
4
解释:
用两个’A’替换为两个’B’,反之亦然。
思路:
滑动窗口法
维持左右指针
设置一个数组记录窗口内各字母数量
右指针不断增加
窗口取右指针指向的字母数量加能修改的数量和原值的最大值
左指针离开窗口后,修改数组内字母数量与指针
找到最大的窗口
最后输出时注意窗口大还是字符串长度大
class Solution {
public int characterReplacement(String s, int k) {
int len = s.length();
char[] str = s.toCharArray();
int width = 0;
int[] count = new int[26];
for(int l=0,r=0 ;r<len;r++){
width = Math.max(width,++count[str[r]-'A']+k);
while(r-l+1>width){
count[str[l++]-'A']--;
}
}
return Math.min(str.length,width);
}
}