1. 解析
題目大意,求解最長的重複子序列,k是可以替換字符的次數
2. 分析
參考@Grandyang的博客,我沒想出來。這裏要用到滑動窗口,根據題意,我們要求解的是在獲取最長的子序列的基礎上,保證重複出現的元素個數最多,所以我們可以維持一個滑動窗口,用start表示當前窗口的起點,並用repeat記錄字母出現的個數,若當前子序列的長度和重複出現最多的字母個數之間的差值大於k,意味着經過k次替換,該子序列無法保證都是重複的字符,故要更新窗口的大小,將start位置往後移動,這樣可以保證當前窗口裏面的字符串可以滿足要求。
class Solution {
public:
int characterReplacement(string s, int k) {
int res = 0, maxCnt = 0, start = 0; //start---窗口的起始位置
vector<int> repeat(26, 0); //記錄字母出現次數
for (int i = 0; i < s.length(); ++i){
maxCnt = max(maxCnt, ++repeat[s[i]-'A']);
while (i - start + 1 - maxCnt > k){
repeat[s[start]-'A']--;
start++; //向左滑動窗口
}
res = max(res, i - start + 1);
}
return res;
}
};