leetcode_1297_子串的最大出現次數

一. 滑動窗口問題.

二. 我們其實只是需要考慮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;
    }
};

發佈了95 篇原創文章 · 獲贊 26 · 訪問量 2119
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章