class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @param k int整型
* @return int整型
*/
int longestSubstring(string s, int k) {
// write code here
// 还是滑动窗口,定义左右指针
// 用一个哈希表存储窗口范围内每种字符的数量,用一个变量记录当前不同字符的数量
// 向右移动右指针,移动后右指针对应字符的计数 + 1,如果是之前没见过的字符,不同字符数 + 1
// 如果不同字符数大于 k,向右移动左指针,左指针对应的字符计数 - 1,如果某个字符计数变为 0,
// 不同字符数 - 1
// 每次窗口大小改变的时候,如果不同字符数小于等于 k,更新最长连续子串长度
unordered_map<char, int> charCount;
int maxLength = 0;
int left = 0;
int uniqueCount = 0;
for (int right = 0; right < s.length(); ++right) {
char currentChar = s[right];
// 增加当前字符计数
if (charCount[currentChar]++ == 0) {
uniqueCount++;
}
// 当窗口内不同字符超过 k 种时,移动左指针直到窗口内不同字符数不超过 k
while (uniqueCount > k) {
if (--charCount[s[left]] == 0) {
uniqueCount--;
}
left++;
}
// 更新最大长度
if (uniqueCount <= k) {
maxLength = max(maxLength, right - left + 1);
}
}
return maxLength;
}
};