给你一个字符串 s
和一个整数 k
,请你找出 至多 包含 k
个 不同 字符的最长子串,并返回该子串的长度。
示例 1:
输入:s = "eceba", k = 2 输出:3 解释:满足题目要求的子串是 "ece" ,长度为 3 。
示例 2:
输入:s = "aa", k = 1 输出:2 解释:满足题目要求的子串是 "aa" ,长度为 2 。
提示:
1 <= s.length <= 5 * 10^4
0 <= k <= 50
解法:双指针滑动窗口
class Solution {
public int lengthOfLongestSubstringKDistinct(String s, int k) {
if (k == 0) {
return 0;
}
Map<Character, Integer> window = new HashMap<>();
int valid = 0;
int ans = 0;
int left = 0;
int right = 0;
while (right < s.length()) {
char c =s.charAt(right);
if (window.getOrDefault(c, 0) == 0) {
valid++;
}
window.put(c, window.getOrDefault(c, 0) + 1);
// 窗口收缩,左指针右移
while (valid > k) {
char delete = s.charAt(left);
left++;
if (window.get(delete) == 1) {
valid--;
}
window.put(delete, window.get(delete) - 1);
}
ans = Math.max(ans, right - left + 1);
right++;
}
return ans;
}
}
时间复杂度
- 时间复杂度:O(n), n 是字符串 s 的长度。
- 空间复杂度:O(k),k 是 s 的字符集合的长度。