395. Longest Substring with At Least K Repeating Characters

90 阅读1分钟

image.png

方法

要求字符串内的每一个字符,出现的次数都超过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;
    }
}