LeetCode 340. 至多包含 K 個不同字元的最長子串
阿新 • • 發佈:2021-01-29
用滑動視窗的辦法來做這道題,用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;
}
}