Longest Repeating Character Replacement

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;
    }
};

 [1]https://www.cnblogs.com/grandyang/p/5999050.html

發佈了155 篇原創文章 · 獲贊 2 · 訪問量 2378
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章