Given a string s
that consists of only uppercase English letters, you can perform at most k
operations on that string.
In one operation, you can choose any character of the string and change it to any other uppercase English character.
Find the length of the longest sub-string containing all repeating letters you can get after performing the above operations.
Note:
Both the string's length and k will not exceed 104.
Example 1:
Input: s = "ABAB", k = 2 Output: 4 Explanation: Replace the two 'A's with two 'B's or vice versa.
Example 2:
Input: s = "AABABBA", k = 1 Output: 4 Explanation: Replace the one 'A' in the middle with 'B' and form "AABBBBA". The substring "BBBB" has the longest repeating letters, which is 4.
思路: 双指针,注意update res的时候, if (j - i - mostFre > k)说明有一个多余的,不行,那么就是j - i - 1; 因为valid length就是j - i;否则就是 j - i;
class Solution {
public int characterReplacement(String s, int k) {
HashMap<Character, Integer> countmap = new HashMap<>();
int j = 0;
int res = 0;
int mostFre = 0;
for(int i = 0; i < s.length(); i++) {
// move j;
while(j < s.length() && j - i - mostFre <= k) {
char c = s.charAt(j);
countmap.put(c, countmap.getOrDefault(c, 0) + 1);
mostFre = Math.max(mostFre, countmap.get(c));
j++;
}
// update res;
if(j - i - mostFre > k) {
res = Math.max(res, j - i - 1);
} else {
res = Math.max(res, j - i);
}
// move i;
char ic = s.charAt(i);
countmap.put(ic, countmap.get(ic) - 1);
}
return res;
}
}