方法
要求字符串内的每一个字符,出现的次数都超过k,找最长的字符串的长度。
具体来说,每次循环中需要记录滑动窗口内不同字符数diff_count 和出现次数大于等于k 的字符数count。逐渐右移右边界,当diff_count 大于i时,也就是滑动窗口内的不同字符数大于当前循环限制的不同字符数,就缩减滑动窗口的左边界直到刚好满足diff_count == i。当diff_count == count == i时,说明滑动窗口内的每个字符出现次数都大于等于k,此时滑动窗口内的元素就是一个可行解。
class Solution {
public int longestSubstring(String s, int k) {
int res = 0;
// specify types of different chars in a window
for (int i = 1; i <= 26; i++) {
// define sliding window
int left = 0, right = 0;
// number of different chars in window
int cur_type = 0;
// number of different chars that is satisfied in window
int cur_satisfied_type = 0;
char[] freq = new char[26];
while (right < s.length()) {
int c = s.charAt(right) - 'a';
freq[c]++;
if (freq[c] == 1) {
cur_type++; // new type
}
if (freq[c] == k) {
cur_satisfied_type++; // satisfied + 1
}
// contract window by moving left
while (cur_type > i) {
int d = s.charAt(left) - 'a';
freq[d]--;
if (freq[d] == 0) {
cur_type--;
}
if (freq[d] == k - 1) {
cur_satisfied_type--;
}
left++;
}
if (cur_satisfied_type == i) {
res = Math.max(res, right - left + 1);
}
right++;
}
}
return res;
}
}