【數論】C038_替換後的最長重複字符(滑動窗口)

一、題目描述

Given a string s that consists of only uppercase English letters, you can perform at most k operations on that string.

In one operation, you can choose any character of the string and change it to any other uppercase English character.

Find the length of the longest sub-string containing all repeating letters you can get after performing the above operations.

Note:
Both the string’s length and k will not exceed 10410^4.

Input:
s = "AABABBA", k = 1

Output:
4

Explanation:
Replace the one 'A' in the middle with 'B' and form "AABBBBA".
The substring "BBBB" has the longest repeating letters, which is 4.

二、題解

方法一:滑動窗口

想法

【數論】C037_最大連續1的個數 I~III 一樣,都是通過最多替換 k 個窗口內部和最長連續相同的字符來尋找最長連續相同子串。

算法

  • l 與 r 維護一個滑窗。
  • 當窗口內的與最多相同的字符不同的字符個數小於 k 個時,我們有權利繼續只增加窗口的右邊界 r,但每次擴張我們都需要記錄一下窗口的大小,避免錯過了某些值。
  • 當窗口內的與最多相同的字符不同的字符個數大於 k 個時,我們通過縮短窗口的左邊界 l,來嘗試去找到更大的窗口。這就是爲什麼我們選擇每次記錄窗口的大小。
    • 這一不同的是我們不是很明確字符的種類有多少,所以我們用 map 來記錄同一種類的字符個數。

* 第一次提交時出錯: 當我們移動左邊界 l 時,我們要將移動之前位於左邊界上的字符的個數減去。

public int characterReplacement(String S, int k) {
    char[] s = S.toCharArray();
    int N = s.length;
    int[] map = new int[26];
    int l = 0, r = 0, max = 0;
    int len = 0;

    while (r < N) {
        int i = s[r]-'A';
        map[i]++;
        max = Math.max(max, map[i]);//統計當前窗口內頻次最大的字符的個數
        if (r-l+1 - max > k) {      //如果窗口內的不同字符的個數大於k個,窗口收縮
            map[i]--;				//出錯
            l++;
        }
        len = Math.max(len, r-l+1);
        r++;
    }
    return len;
}

* 更正後的代碼:

public int characterReplacement(String S, int k) {
    char[] s = S.toCharArray();
    int N = s.length;
    int[] map = new int[26];
    int l = 0, r = 0, max = 0;
    int len = 0;

    while (r < N) {
        int i = s[r]-'A';
        map[i]++;
        max = Math.max(max, map[i]);//統計當前窗口內頻次最大的字符的個數
        if (r-l+1 - max > k) {      //如果窗口內的不同字符的個數大於k個,窗口收縮
            map[s[l]-'A']--;		//注意點
            l++;
        }
        len = Math.max(len, r-l+1);
        r++;
    }
    return len;
}

複雜度分析

  • 時間複雜度:O(n)O(n)
  • 空間複雜度:O(1)O(1)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章