链接
https://leetcode-cn.com/problems/longest-repeating-character-replacement/
耗时
解题:1 h 27 min
题解:28 min
题意
给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次。在执行上述操作后,找到包含重复字母的最长子串的长度。
注意:字符串长度 和 k 不会超过 1 0 4 10^4 104。
思路
这种写法细节非常多。。。
大体思路,分别尝试将每个大写字母作为重复字母,维护一个滑动窗口,窗口内都是当前大写字母或者是k个以内的非当前大写字母,从字符串头滑动到尾。窗口的最大长度即为答案。
细节:
- 每次向后滑动需要更新k,如果滑走之前的字符与当前重复字母不同,k需要置于为1,但需要注意的是原始k可能等于0,需要特判。
- 滑动窗口向后移需要保证 r ≥ \geq ≥ l,但是当比较的第一个字符就和当前重复字母不同并且k=0时需要重新确保 r ≥ \geq ≥ l。
时间复杂度: O ( 26 ∗ 2 ∗ n ) = O ( 1 0 5 ) O(26*2*n)=O(10^5) O(26∗2∗n)=O(105)
AC代码
class Solution {
public:
int characterReplacement(string s, int k) {
int n = s.size();
if(k+1 >= n) {
return n;
}
int ans = 1;
for(char c = 'A'; c <= 'Z'; ++c) {
int l = 0, r = 0;
while(r < n) {
if(ans >= n-l) {
break;
}
int tmpk = (l==0)?k:((s[l-1]==c)?0:min(1,k));
while(r < n) {
if(s[r] != c) {
if(tmpk > 0) {
tmpk--;
}
else {
break;
}
}
r++;
}
ans = max(ans, r-l);
l++;
r = max(l, r);
}
ans = max(ans, r-l);
}
return ans;
}
};