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