目录
力扣424. 替换后的最长重复字符
题目链接:力扣424. 替换后的最长重复字符
给你一个字符串 s 和一个整数 k 。你可以选择字符串中的任一字符,并将其更改为任何其他大写英文字符。该操作最多可执行 k 次。
在执行上述操作后,返回包含相同字母的最长子字符串的长度。
示例 1:
输入:s = "ABAB", k = 2
输出:4
解释:用两个'A'替换为两个'B',反之亦然。
示例 2:
输入:s = "AABABBA", k = 1
输出:4
解释:
将中间的一个'A'替换为'B',字符串变为 "AABBBBA"。
子串 "BBBB" 有最长重复字母, 答案为 4。
提示:
1 <= s.length <= 10^5
s 仅由大写英文字母组成
0 <= k <= s.length
解题思路:
题目给出的字符串全为大写字母,因此我们可以用一个一维数组来模拟当前字串的字母的数量,用双指针,每次移动右端点,将右端点字母添加进来,并求出当前字串的最多字母的数量,判断是否满足剩下的元素<= k,如果不满足代表无法实现,此时左端点进行缩进,并从一维数组中删除左端点的字母,直到实现位置,最后得到的一定是合法的,我们保留每次合法子串的最大值即可
class Solution {
public:
int characterReplacement(string s, int k) {
//模拟子串中26个字母的数量
int a[26] = {0}, ans = 0;
//maxn是当前子串中最多字母的数量
int n = s.size(), maxn = 0;
//左右端点
int l = 0, r = 0;
while(r < n)
{
//每一次将右端点添加进模拟数组
a[s[r]-'A']++;
//计算出当前子串的最多字母数量
maxn = max(maxn, a[s[r]-'A']);
//如果子串长度减当前子串的最多字母数量要大于k,代表无法实现,将左端点一直移动直到可以实现的位置
while(r-l+1 - maxn > k)
{
//所以删除最左侧元素,移动左端点
a[s[l]-'A']--;
l++;
}
//每次出了循环或没进循环代表此刻的子串一定合法,我们取最大值
ans = max(ans, r-l+1);
//移动右端点
r++;
}
//返回字串长度
return ans;
}
};