题目描述
思路 滑动窗口
其实一开始觉得是用动态规划做,后来才发现是很经典的滑动窗口问题
我们假设k为0,那么求的就是最长重复子字符串。
求最长重复字符串的思路如下:
窗口从左至右不断扩张/滑动,当窗口触达字符串末尾字符时,运算结束,窗口的宽度为最终结果。
初始窗口的宽度为 1,我们不断的通过向当前窗口覆盖的子串后面追加一个字符看是否能满足我们的要求:如果满足窗口扩张,如果不满足,窗口向右滑动。
代码:
class Solution {
public:
vector<int> search;
int characterReplacement(string s, int k) {
search = vector<int>(26, 0);
if(s.size() == 0) return 0;
int left = 0;
int right = 0;
int maxAlphabet = 0;
while(right < s.size()) {
//更新最新的最多字母
int index = s[right] - 'A';
search[index]++;
maxAlphabet = max(maxAlphabet, search[index]);
//最多字母不足以填满窗口
//窗口右移
if(maxAlphabet + k < right - left + 1) {
search[s[left] - 'A']--;
left++;
}
right++;
}
return right - left + 1 - 1;
}
};