一. 滑動窗口問題.
二. 我們其實只是需要考慮minSize. 理由是minSize一定滿足maxSize的限制條件,並且可能出現的次數更多,所以是固定大小的滑動窗口問題.
三. 仔細思考下,其實她的複雜度是O(n), 因爲滑動窗口如果不滿足條件的話每次向右滑動一個, 滿足條件的也只有一個.
class Solution {
public:
int maxFreq(string s, int maxLetters, int minSize, int maxSize) {
map<string, int> count;
int len = s.length();
vector<int> hash(26,0);
int l=0, result = 0, unique=0;
//先只移動right指針.
for(int r=0;r<len;r++) {
如果字符第一次出現unique++且字符出現個數也++.
if(hash[s[r]-'a']++ == 0) unique++;
//當不滿足條件,left移動,字符出現個數==1,則刪除這個字符後unique--.
while (unique>maxLetters || r-l+1>minSize) {
if(hash[s[l++] -'a']-- == 1) {
unique--;
}
}
//如果滿足限制條件,則加入count哈希表中,計算出現的次數.
//最後的結果是出現次數最多的.
if(r-l+1==minSize){
string cur = s.substr(l, r-l+1);
count[cur]++;
result = max(result, count[cur]);
}
}
return result;
}
};
四. 1. 套用之前學過的通用模板.
2. 先找到可行解, 再優化得到最優解.
3. 複雜度是O(n).
class Solution {
public:
int maxFreq(string s, int maxLetters, int minSize, int maxSize) {
int left=0, right=0;
map<char, int> window;
map<string, int> count;
int res = INT_MIN;
int match = 0;
while(right<s.length()) {
window[s[right]]++;
if(window[s[right]]==1) match++;
//先移動右指針.
right++;
//等滿足條件,即達到規定的長度.
while(right-left==minSize) {
//如果不同字符個數小於maxLetters,則
//加入最終結果計算次數.
if(match<=maxLetters)
count[s.substr(left,right-left)]++;
//再移動左指針.
window[s[left]]--;
if(window[s[left]]==0) match--;
left++;
}
}
for(auto i:count) {
res = max(i.second, res);
}
//如果沒有滿足條件的子串,則返回0.
return res==INT_MIN ? 0:res;
}
};