滑動視窗3.替換後最長重複字元子串

愛抖腿的嘻嘻嘻發表於2020-12-19

給一個全部是大寫字母的字串,可以替換k次,求替換k次之後字串中最長的重複子串的長度。
首先這個題是連續子串,用滑動視窗法,且是求最長字串,所以先移動end,當移動到不符合要求時,可以左右一起推進一格(因為此時即使是start先移動,也不可能有比之前更好的答案,最多就是持平,所以乾脆全都移動一次)
怎麼判斷是否符合條件,也就是看視窗中最多的重複字元有幾個,再加上k就是可以出現的最長字串,可以用一個雜湊表來記錄視窗中最多的字串,如果用HahMap的話,就可以用A到Z來表示各個key,value是出現次數,選擇其中最多的一個。其實可以用一個陣列,如果此時字元是c,則c-‘A’就是它在字元陣列中的位置,將該位置加1即可。
沒必要在一個while迴圈中再套一個while迴圈讓所有符合要求的right都移動完,這樣寫起來很麻煩,就簡簡單單每次進來都先處理上次加過的end,然後再判斷是否不符合要求,不符合則移動左邊,最後更新max。

class Solution {
    public int characterReplacement(String s, int k) {
        if(s==null || s.length()==0)return 0;
        if(k>s.length())return s.length();
        int max=0;
        int end=0;
        int start=0;
        int winMax=0;//當前視窗最大值
        int[] win=new int[26];
        while(end<s.length()){
            int index=s.charAt(end)-'A';
            win[index]++;
            winMax=Math.max(winMax,win[index]);
            if(end-start+1>winMax+k){
                win[s.charAt(start)-'A']--;
                start++;
            }
           max=Math.max(max,end-start+1);
            end++;
            }
            return max; 
        }
}

相關文章