424 longest repeating character replacement

https://leetcode.com/problems/longest-repeating-character-replacement/

马甲题,其实就是控制string里面不同的字符不要超过k个的最长substring

这里的思路类似于395

class Solution {
    public int characterReplacement(String s, int k) {
        char[] input = s.toCharArray();
        Set<Character> set = new HashSet<>();
        int ans = 0;
        int n = input.length;
        for (char ch : input) {
            set.add(ch);
        }
        for (char curCh : set) {
            // char curCh = (char)('A' + i);
            int l = 0;
            int diffCnt = 0;
            for (int r = 0; r < n; r++) {
                if (curCh != input[r]) {
                    diffCnt++;
                } 
                while (diffCnt > k) {
                    if (curCh != input[l]) {
                        diffCnt--;
                    }
                    l++;
                }
                ans = Math.max(ans, r - l + 1);
            }
        }
        return ans;
    }
}

你也可以反转一下,这样就不用针对每个char单独查一次了。在每个range里以重复次数最多的char为基础(maxsame),然后要求除此之外的char不能超过k个。

class Solution {
    public int characterReplacement(String s, int k) {
        char[] arr = s.toCharArray();
        int[] freqs = new int[26];
        int maxSame = 0;
        int i = 0;
        int maxLen = 0;
        for (int j = 0; j < arr.length; j++) {
            char ch = arr[j];
            freqs[ch-'A']++;
            maxSame = Math.max(maxSame, freqs[ch-'A']);
            while (j-i+1-maxSame > k) {
                ch = arr[i++];
                freqs[ch-'A']--;
                if (freqs[ch-'A'] == 0) {
                    maxSame = Math.max(maxSame, freqs[ch-'A']);
                }
            }
            maxLen = Math.max(maxLen, j-i+1);
        }
        return maxLen;
    }
}

Last updated