1. 程式人生 > >395.至少有K個重複字元的最長子串

395.至少有K個重複字元的最長子串

找到給定字串(由小寫字元組成)中的最長子串 T , 要求 T 中的每一字元出現次數都不少於 k 。輸出 的長度。

示例 1:

輸入:s = "aaabb", k = 3
輸出:3
最長子串為 "aaa" ,其中 'a' 重複了 3 次。

示例 2:

輸入:s = "ababbc", k = 2
輸出:5
最長子串為 "ababb" ,其中 'a' 重複了 2 次, 'b' 重複了 3 次。

class Solution {
public:
    int longestSubstring(string s, int k) {
        int res = 0, i = 0, n = s.size();
        while (i + k <= n) {
            int m[26] = {0}, mask = 0, max_idx = i;
            for (int j = i; j < n; ++j) {
                int t = s[j] - 'a';
                ++m[t];
                if (m[t] < k) mask |= (1 << t);
                else mask &= (~(1 << t));
                if (mask == 0) {
                    res = max(res, j - i + 1);
                    max_idx = j;
                }
            }
            i = max_idx + 1;
        }
        return res;
    }
};