1. 程式人生 > 實用技巧 >LeetCode——至多包含 K 個不同字元的最長子串

LeetCode——至多包含 K 個不同字元的最長子串

Q:定一個字串 s ,找出 至多 包含 k 個不同字元的最長子串 T。

示例 1:
輸入: s = "eceba", k = 2
輸出: 3
解釋: 則 T 為 "ece",所以長度為 3。
示例 2:
輸入: s = "aa", k = 1
輸出: 2
解釋: 則 T 為 "aa",所以長度為 2。

A:滑動視窗

    public int lengthOfLongestSubstringKDistinct(String s, int k) {
        if (k == 0 || s.length() == 0) {
            return 0;
        }
        int maxLength = 0;
        int left = 0, right = 0;
        HashMap<Character, Integer> cMap = new HashMap<>();
        while (right < s.length()) {
            char r = s.charAt(right);
            cMap.put(r, cMap.getOrDefault(r, 0) + 1);
            if (cMap.keySet().size() <= k) {
                maxLength = Math.max(maxLength, right - left + 1);
            } else {
                while (left != right) {
                    char l = s.charAt(left++);
                    int lNum = cMap.get(l) - 1;
                    if (lNum == 0) {
                        cMap.remove(l);
                        break;
                    } else {
                        cMap.put(l, lNum);
                    }
                }
            }
            right++;
        }
        return maxLength;
    }