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;
}