给你一个字符串 s 和一个整数 k ,请你找出 至多 包含 k 个 不同 字符的最长子串,并返回该子串的长度。
示例 1:
输入: s = "eceba", k = 2
输出: 3
解释: 满足题目要求的子串是 "ece" ,长度为 3 。
示例 2:
输入: s = "aa", k = 1
输出: 2
解释: 满足题目要求的子串是 "aa" ,长度为 2 。
思路
可以穷举所有字串得到解--换滑动窗口法--收缩左边界的条件是当前窗口不重复元素个数大于k
个人题解
class Solution {
public int lengthOfLongestSubstringKDistinct(String s, int k) {
//暴力穷举----优化:滑动窗口,收缩左边界条件是出现重复字符
char[] windows = new char[128];
int left = 0;
int right = 0;
int res = -1;
//用curSize记录当前窗口中不重复的字符个数
int curSize = 0;
while (right < s.length()) {
if (windows[s.charAt(right)] == 0)
curSize++;
windows[s.charAt(right)]++;
//curSize超过k时候就不满足要求,开始收缩左边界直到窗口符合要求
while (curSize > k) {
windows[s.charAt(left)]--;
if (windows[s.charAt(left)] == 0)
curSize--;
left++;
}
//每次窗口符合要求时候都要更新最长字串
res = Math.max(res, right - left + 1);
right++;
}
return res;
}
}