1. 程式人生 > 其它 >LeetCode 340. 至多包含 K 個不同字元的最長子串

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

技術標籤:leetcodejavaleetcode

用滑動視窗的辦法來做這道題,用set儲存當前集合的不同字母的個數。用長度為128的陣列儲存字元個數。

// 試圖用視窗法來做,用set來儲存當前集合的字母的多少
// k = 0的情況,s = null的情況
class Solution {
    public int lengthOfLongestSubstringKDistinct(String s, int k) {
        int maxLen = 0;     // 記錄當前最長子串,初始為0
        int l = 0;          // 記錄當前左視窗位置
        
        int
[] freq = new int[128]; // 記錄每個字元的次數 HashSet<Character> curCharacters = new HashSet(); for(int r = 0; r < s.length(); r++){ // 滑動右指標,直到集合的大小大於k if(curCharacters.size() <= k){ curCharacters.add(s.charAt(r)); freq[s.charAt
(r)]++; } // 滑動左指標,直到集合大小等於k while(curCharacters.size() > k){ if(--freq[s.charAt(l)] <= 0){ curCharacters.remove(s.charAt(l)); } l++; } maxLen = Math.max(maxLen, r - l +
1); } return maxLen; } }

實際上可以精簡一下,用hashmap儲存不同字母的個數和各個字元的個數。


class Solution {
    public int lengthOfLongestSubstringKDistinct(String s, int k) {
        int maxLen = 0;     // 記錄當前最長子串,初始為0
        int l = 0;          // 記錄當前左視窗位置
        
        HashMap<Character, Integer> chars = new HashMap();

        for(int r = 0; r < s.length(); r++){
            // 滑動右指標,直到集合的大小大於k
            if(chars.size() <= k){
                chars.put(s.charAt(r), chars.getOrDefault(s.charAt(r), 0) + 1);
            }

            // 滑動左指標,直到集合大小等於k
            while(chars.size() > k){
                chars.put(s.charAt(l), chars.get(s.charAt(l)) - 1);
                if(chars.get(s.charAt(l)) <= 0){
                    chars.remove(s.charAt(l));
                }
                l++;
            }
            maxLen = Math.max(maxLen, r - l + 1);
            
        }
        return maxLen;
    }
}