1. 解析
题目大意,求解最长的重复子序列,k是可以替换字符的次数
2. 分析
参考@Grandyang的博客,我没想出来。这里要用到滑动窗口,根据题意,我们要求解的是在获取最长的子序列的基础上,保证重复出现的元素个数最多,所以我们可以维持一个滑动窗口,用start表示当前窗口的起点,并用repeat记录字母出现的个数,若当前子序列的长度和重复出现最多的字母个数之间的差值大于k,意味着经过k次替换,该子序列无法保证都是重复的字符,故要更新窗口的大小,将start位置往后移动,这样可以保证当前窗口里面的字符串可以满足要求。
class Solution {
public:
int characterReplacement(string s, int k){
int n = s.size(), left = 0, mostChar = 0, res = 0;
vector<int> nums(26, 0);
for (int right = 0; right < n; ++right){
mostChar = max(mostChar, ++nums[s[right]-'A']); //获取当前出现次数最多的字符
if (right - left + 1 - mostChar > k){ //维持大小为k的窗口
--nums[s[left++]-'A']; //滑动左窗口
}
res = max(res, right - left + 1); //更新结果
}
return res;
}
};