1 解题思想
这道题是给了一个由A-Z所构成的英语字符串,然后又k个名额,可以将任意字符替换为另一个字符
现在问,对于给定的条件,能找出的最长的相同的字符序列是多少?
这道题需要用滑动窗口的方式进行,分26个字母去一一尝试,
2 原题
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.
3 AC解
public class Solution {
public int characterReplacement(String s, int k) {
int n = s.length();
if ( n == 0 ) return 0;
char chars[] = s.toCharArray();
int res = 0;
for(int i=0;i<26;i++){
res = Math.max(res,helper(chars,k,n,(char)('A'+i)));
}
return res;
}
/**
* 采用滑动窗口的方式进行判别
* */
private int helper(char[] seqs,int k,int n,char valid){
int start = 0;
int end = 0;
int res = 0;
int usedK = 0;
while( end < n ){
if(seqs[end] == valid || usedK < k){
if(seqs[end]!= valid)
usedK ++;
res = Math.max(res, end - start + 1);
end++;
} else{
//当前长度不够了,需要将头部的进行处理,并且替换已经使用的替换名额
if(seqs[start] != valid)
usedK --;
start++;
}
}
//System.out.println((char)valid + " " + res);
return res;
}
}
再次特别注明:我发代码的时候是题目当天出来的时候,已经AC了,但是Leetcode可能会更改测试用例,导致代码无法AC
如果出现上述情况,请给我留言,我会修正更新代码