前言:为了后续的实习面试,开始疯狂刷题,非常欢迎志同道合的朋友一起交流。因为时间比较紧张,目前的规划是先过一遍,写出能想到的最优算法,第二遍再考虑最优或者较优的方法。如有错误欢迎指正。博主首发CSDN,mcf171专栏。
博客链接:mcf171的博客
——————————————————————————————
Given a string that consists of only uppercase English letters, you can replace any letter in the string with another letter at most k times. Find the length of a longest substring 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.这个题目的理解对我帮助很大,这个题目的解法在于用两个变量,一个l,一个r 来控制读取字符串的范围,用一个maxCount记录当前[l,r]范围中最大的字符串是多少,用maxLength记录访问过的范围中最大的长度是多少。时间复杂度O(n),空间复杂度O(1)。 Your runtime beats 24.85% of java submissions.
public class Solution {
public int characterReplacement(String s, int k) {
if(s.length() < 2) return s.length();
int r = 0, l = 0, maxCount = 0, maxLength = 0;
int[] letters = new int[26];
while(r < s.length()){
int letter = s.charAt(r) - 'A';
maxCount = Math.max(maxCount, ++ letters[letter]);
if(r - l + 1 > maxCount + k){
letters[s.charAt(l) - 'A'] --;
l++;
}
maxLength = Math.max(maxLength, r-l + 1);
r ++;
}
return maxLength;
}
}