1297 子串的最大出現次數;145/94/144迭代遍歷二叉樹(前中序,和我之前一篇Morris遍歷一起記憶背誦)

給你一個字符串 s ,請你返回滿足以下條件且出現次數最大的 任意 子串的出現次數:


    子串中不同字母的數目必須小於等於 maxLetters 。
    子串的長度必須大於等於 minSize 且小於等於 maxSize 。


 

示例 1:

輸入:s = "aababcaab", maxLetters = 2, minSize = 3, maxSize = 4
輸出:2
解釋:子串 "aab" 在原字符串中出現了 2 次。
它滿足所有的要求:2 個不同的字母,長度爲 3 (在 minSize 和 maxSize 範圍內)。


示例 2:

輸入:s = "aaaa", maxLetters = 1, minSize = 3, maxSize = 3
輸出:2
解釋:子串 "aaa" 在原字符串中出現了 2 次,且它們有重疊部分。


示例 3:

輸入:s = "aabcabcab", maxLetters = 2, minSize = 2, maxSize = 3
輸出:3


示例 4:

輸入:s = "abcde", maxLetters = 2, minSize = 3, maxSize = 3
輸出:0


 

提示:


    1 <= s.length <= 10^5
    1 <= maxLetters <= 26
    1 <= minSize <= maxSize <= min(26, s.length)
    s 只包含小寫英文字母。

class Solution {
public:
    int maxFreq(string s, int maxLetters, int minSize, int maxSize) {
        //審題很重要,maxSize這個參數沒有用,直接求子串長度爲minSize即可
        unordered_map<string,int> m;//計數
        int max=0;
        for(int i=0;i<s.size()-minSize+1;++i){
            string sub=s.substr(i,minSize);//minSize
            set<char> temp(sub.begin(),sub.end());//maxLetters
            if(temp.size()<=maxLetters)          
                max=max>++m[sub]?max:m[sub];                                           
        }       
        return max;
    }
};

二叉樹迭代遍歷,前中序

當前有棧,循環入當,左t右p,p後取值,中反tp,後反左右,後右空前

1)前序框架(中後序都有此推導記憶)		
	void preorder(TreeNode* root) {
        stack<TreeNode*> S;
        TreeNode* cur = root;
        while(cur || S.size()){
            while(cur){
                S.push(cur);
		operate(cur->val);//				
                cur=cur->left;
            }
            cur=S.top();			
            cur=cur->right;//
	    S.pop();//
        }      
}
2)中序		
	void inorder(TreeNode* root) {
        stack<TreeNode*> S;
        TreeNode* cur = root;
        while(cur || S.size()){
            while(cur){
                S.push(cur);				
                cur=cur->left;
            }
            cur=S.top();
	    S.pop();//
            operate(cur->val);//
            cur=cur->right;//
        }      
}     
3)後序1	
	void postorder1(TreeNode* root) {
        stack<TreeNode*> S;
        TreeNode* cur = root;
	vector<int> v;
        while(cur || S.size()){
            while(cur){
                S.push(cur);
		v.push_back(cur->val);//			
                cur=cur->right;//
            }
            cur=S.top();			
            cur=cur->left;//
	    S.pop();
        }   
	reverse(v.begin(),v.end());//
	opreate(v);//
}
4)後序2
	void postorder(TreeNode* root) {
        stack<TreeNode*> S;
        TreeNode* cur = root,*pre=nullptr;
        while(cur || S.size()){
            while(cur){
                S.push(cur);
		operate(cur->val);//				
                cur=cur->left;
            }
            cur=S.top();	
	    if(cur->right==nullptr||cur->right==pre){//
		S.pop();
		operate(cur->val);
		pre=cur;
		cur=nullptr;
	    }
	    else
		cur=cur->right;//			
        }      
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章