这道题要求给定一个字符串,然后一个k,求一个最大子串的不重复的字符不大于k的最大子串长度
分析:这道题本质要维护一个窗口,即要维护一个hashmap,key为字符,value为窗口内的该字符的个数,然后在窗口扩张过程中,检查chars[end]是否被包含在map中,或者map的大小是否小于k,如果是直接添加;否则就要转为收缩,即start开始收缩,直到到达合适位置
public class Solution {
public int lengthOfLongestSubstringKDistinct(String s, int k) {
HashMap<Character,Integer> maps = new HashMap<>();
char[] chars = s.toCharArray();
if(k >= chars.length)
return chars.length;
int start = 0,end = k-1;
int length = end-start;
for(int i = 0;i<k;i++){
if(!maps.containsKey(chars[i]))
maps.put(chars[i],0);
maps.replace(chars[i],maps.get(chars[i])+1);
}
for(int i = k;i<chars.length;i++){
if(maps.size()<k || maps.containsKey(chars[i])){
if(!maps.containsKey(chars[i])){
maps.put(chars[i],0);
}
maps.replace(chars[i],maps.get(chars[i])+1);
if(++end - start > length)
length = end - start;
}else{//start remove
while(maps.size() == k && start <= end){
int count = maps.get(chars[start]) - 1;
if(count == 0){
maps.remove(chars[start]);
}else{
maps.replace(chars[start],count);
}
start++;
}
if(start <= end){
maps.put(chars[i],1);
end = i;
}
}
}
return length+1;
}
}