1004. 最大连续1的个数 III
给定一个由若干 0 和 1 组成的数组 A,我们最多可以将 K 个值从 0 变成 1 。返回仅包含 1 的最长(连续)子数组的长度。
分析:
- 目的就是求一个最大的窗口,这个窗口中的所有的值都是1,但是其实是由部分1和部分0构成的
- 最终的窗口的大小应该是一些1和K个0构成的
- 所以如何当前窗口的1的个数加上0的个数是小于当前的1的个数加上k,那么就将窗口进行往右扩充,否则左指针移动,收缩窗口
class Solution {
public:
int longestOnes(vector<int>& A, int K) {
int l = 0;
int r = 0;
int cnt_zero = 0;
int res = 0;
//i表示的就是右指针
while(r<A.size()){
if(A[r]==0) cnt_zero++;
while(cnt_zero>K){
if(A[l]==0) cnt_zero--;
l++;
}
//什么情况下进行计算res, 就是l和r正好都在合法窗口的边界的时候,前面的这个while相当于是一个过滤的作用
res = max(res, r-l+1);//r表示的是满足条件的窗口的右边
r++;
}
return res;
}
};
424. 替换后的最长重复字符
给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次。在执行上述操作后,找到包含重复字母的最长子串的长度。
注意:
字符串长度 和 k 不会超过 104。
示例 1:
输入:
s = “ABAB”, k = 2
输出:
4
解释:
用两个’A’替换为两个’B’,反之亦然。
分析:
和上一题不同的是,上一题是包含有两个字符,即字符1 和字符0,本题包含多个字符,那么相对于上一题的字符1的话,就是要统计当前的字符的评率最大的字符。
class Solution {
public:
int characterReplacement(string s, int k) {
int r = 0;
int l = 0;
//使用一个26长的整型数组进行存储每个字符串的个数
vector<int> times(26);
int res = 0;
while(r<s.size()){
//当前窗口统计当前最大的重复字符的个数
times[s[r]-'A']++;
int max_v = 0;
max_v = *max_element(times.begin(), times.end());
int len = r-l+1;
while((len-max_v)>k){
if(times[s[l]-'A']>0) times[s[l]-'A']-=1;
l++;
len = r-l+1;
}
res = max(res, r-l+1);
r++;
}
return res;
}
};