• 難度分: 1748
  • 這題的 minSize 和 maxSize 在 26 以內,範圍不會太大,可以用定長度的 sliding window 硬解。
class Solution {
public:
    int maxFreq(string s, int maxLetters, int minSize, int maxSize) {
        int res = 0;
        for (int i = minSize; i <= maxSize; i++) {
            res = max(res, maxFreqWithWindowSize(s, maxLetters, i));
        }
        return res;
    }
    int maxFreqWithWindowSize(string& s, int th, int k) {
        int n = s.size();
        int cnt[26];
        memset(cnt, 0, sizeof(cnt));
        int uq = 0;
        int res = 0;
        unordered_map<string, int> map;
        for (int i = 0; i < k; i++) {
            if (cnt[s[i]-'a']++ == 0) uq++;
        }
        if (uq <= th) {
            map[s.substr(0, k)]++;
            res = 1;
        };
        for (int i = k; i < n; i++) {
            if (cnt[s[i]-'a']++ == 0) uq++;
            if (--cnt[s[i-k]-'a'] == 0) uq--;
            if (uq <= th) {
                string t = s.substr(i-k+1, k);
                res = max(res, ++map[t]);
            }
        }
        return res;
    }
};