395. 至少有 K 个重复字符的最长子串
C代码:滑动窗口 ---- 不是吧,阿sir,这也能滑?
// 返回滑动窗口的长度
// 满足条件的种类数量的可能为 [1, 26], 所以需要遍历26中情况的窗口长度
// 当 区间内所有种类数量 == 满足要求的种类数量,就记录窗口长度
// 滑动窗口移动判断条件、传统滑动窗口的条件针对简单模型
int longestSubstring(char* s, int k) {
int ret = 0;
int n = strlen(s);
for (int t = 1; t <= 26; t++) { // 对26种情况从头到尾遍历一次滑动窗口
int l = 0;
int cnt[26];
memset(cnt, 0, sizeof(cnt));
int tot = 0; // 区间所有的字符「种类数量」
int sum = 0; // 「出现次数不少于 k」的字符种类数量
for (int r = 0; r < n; ++r) { // 窗口右端点右移
cnt[s[r] - 'a']++;
if (cnt[s[r] - 'a'] == 1) { // 种类数量
tot++;
}
if (cnt[s[r] - 'a'] == k) { // 种类数量,计一次
sum++;
}
while (tot > t) { // 滑动窗口的判断条件是啥?很关键!
int t = s[l++] - 'a'; // 窗口左端点右移
cnt[t]--;
if (cnt[t] == 0) { // 此种类消失
--tot;
}
if (cnt[t] == k - 1) { // 此种类数量不满足要求
--sum;
}
}
if (tot == sum) { // 区间内所有种类数量 == 满足要求的种类数量
ret = fmax(ret, r - l + 1);
}
}
}
return ret;
}