我感觉不到这一题和https://blog.csdn.net/chaochen1407/article/details/44041185 有什么本质上的差别。基本都是一样的思想,用快慢指针维护一个窗口,快指针就走最普通的for循环遍历方式,然后根据窗口里面的内容确定是否推进慢指针,如果窗口里面的distinct characters已经多于k个,就开始前移慢指针缩小窗口直到窗口内的独立的字符不多于k个。统计独立字符就依靠一个HashMap<Character, Integer>或者一个int数组都行。统计窗口内的字符的个数,当出现新字符的时候(也就是字符的个数从0变成1)独立的字符的个数就加一,就这样,解法就是把上面那个链接的解法从2变成n。
public int lengthOfLongestSubstringKDistinct(String s, int k) {
int head = 0;
int result = 0;
int curCnt = 0;
int[] chMap = new int[256];
for (int i = 0; i < s.length(); i++) {
int chIdx = s.charAt(i);
chMap[chIdx]++;
if (chMap[chIdx] == 1) {
curCnt++;
}
while (curCnt > k) {
chIdx = s.charAt(head);
chMap[chIdx]--;
if (chMap[chIdx] == 0) curCnt--;
head++;
}
result = Math.max(result, i - head + 1);
}
return result;
}