- 難度分: 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;
}
};