题目概述
链接: link.
给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次。在执行上述操作后,找到包含重复字母的最长子串的长度。
注意:字符串长度 和 k 不会超过 104。
示例
示例 1:
输入:s = “ABAB”, k = 2
输出:4
解释:用两个’A’替换为两个’B’,反之亦然。
示例 2:
输入:s = “AABABBA”, k = 1
输出:4
解释:
将中间的一个’A’替换为’B’,字符串变为 “AABBBBA”。
子串 “BBBB” 有最长重复字母, 答案为 4。
方法
想法:首先看到这道题,需要注意到一个限制条件就是K,只能替换到K个不同的字符,以此来找到最长的字符串。这就能自然而然的想到使用一个滑动的窗口去搜索这个最长的相同的字符串。
1.设置左右的双指针来控制滑动窗口,使用一个vector容器来存储滑动窗口内的每个字符的数量,需要保证的是在这个滑动窗口中的字符除了出现最多的那个字符外的,其他的个数不能超过K个。
2.每次控制右指针移动,如果不满足1的条件,则左指针向左移动。相应的vector容器中对应字符的数量也应减1.
代码
class Solution {
public:
int characterReplacement(string s, int k) {
//使用容器存储滑动窗口内字符的数量
vector<int > num(26);
int n = s.length();
int maxn = 0;
int left = 0,right = 0;
while(right<n)
{
//遍历的每个字符都优先存入,与最大数量的字符对比
num[s[right]-'A']++;
maxn = max(num[s[right]-'A'],maxn);
if(right-left+1-maxn>k)
{
num[s[left]-'A']--;
left++;
}
right++;
}
return right-left;
}
};
结果
思考
个人感觉最重要的就是在左指针的移动上,若不满足替换K个不同字符,则左指针移动,左指针的移动就是为了保存原来的最长长度。