1. 程式人生 > >Longest Repeating Character Replacement

Longest Repeating Character Replacement

++ placement tar 自然 rac 有一個 角度 mat HA

2018-06-29 22:56:24

問題描述:

技術分享圖片

問題求解:

本題是一條字符串問題,且是求Optimal,自然最初想到的是使用DP來進行求解,但是問題就是如果采用DP的話,前一個狀態也太多了,和替換了多少了k值相關,因此從這個角度來說,使用DP來處理本題是不太合適的。

那麽,另一個處理的手段滑動窗口就呼之欲出了。

在本題中窗口[start, end]來維護,其中只要窗口長度 - 窗口中出現字符最多的個數 <= k則當前窗口的長度符合題意,只要找出最長的符合條件的窗口即可。

問題是如果出現了上述條件不滿足的情況,那麽就需要減小窗口大小使之滿足條件。

這裏有一個trick,就是在減小窗口大小的時候是不需要對maxcnt的大小進行修改的,因為如果要得到一個比當前的res更好的解,那麽勢必窗口大小要增大,同時maxcnt也要增大。因此這裏不需要重新遍歷一遍來獲得新的窗口中的maxcnt。

    public int characterReplacement(String s, int k) {
        int res = 0;
        int start = 0;
        int[] cnt = new int[26];
        int maxcnt = 0;
        for (int end = 0; end < s.length(); end++) {
            maxcnt = Math.max(maxcnt, ++cnt[s.charAt(end) - ‘A‘]);
            if (end - start + 1 - maxcnt > k) {
                cnt[s.charAt(start++) - ‘A‘]--;
            }
            res = Math.max(res, end - start + 1);
        }
        return res;
    }

Longest Repeating Character Replacement