替换后的最长重复字符
给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次。在执行上述操作后,找到包含重复字母的最长子串的长度。
注意:
字符串长度 和 k 不会超过 104。
示例 1:
输入:
s = "ABAB", k = 2
输出:
4
解释:
用两个'A'替换为两个'B',反之亦然。
思路+代码+注释:
public int characterReplacement(String s, int k) {
/*
思路:题目是要找替换后最长的所有字母重复的子串
如果一个字符串要变成所有字母重复的字符串最少替换的字符数就是字符串长度-出现最多的字符的次数,类比到子串就是子串长度-出现最多的字母的次数<=k
使用滑动窗口来做,滑动窗口就相当于子串
start为窗口起始位置初始为0,遍历字母,统计字母出现个数(这里就26个字母使用数组存储每个字母出现次数),找出最大出现个数,
如果子串长度-最大个数>k说明子串长了也就是窗口大了,那么将窗口的start右移,start字符被丢弃次数-1,start++
*/
int start=0;
int max=0;
int res=0;
int[] nums=new int[26];
for (int i = 0; i < s.length(); i++) {
char c=s.charAt(i);
nums[c-'A']++;
max=maxInArr(nums);
int childLen=i-start+1;
if (childLen-max>k)
{
nums[s.charAt(start)-'A']--;
start++;
childLen--;
}
if (childLen>res)
{
res=childLen;
}
}
return res;
}
private int maxInArr(int[] nums)
{
int max=nums[0];
for (int i = 1; i < nums.length; i++) {
if (max<nums[i])
{
max=nums[i];
}
}
return max;
}