LeetCode每日一題5月23日 LeetCode76.最小覆蓋字串

問題描述:

給你一個字符串 S、一個字符串 T,請在字符串 S 裏面找出:包含 T 所有字符的最小子串。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/minimum-window-substring

示例:

輸入: S = "ADOBECODEBANC", T = "ABC"
輸出: "BANC"
說明:

如果 S 中不存這樣的子串,則返回空字符串 ""。
如果 S 中存在這樣的子串,我們保證它是唯一的答案。

解題思路:

使用滑動窗口思想,

開闢倆個map結構,一個用來存儲字符串T中的字符

        for(char c:t){
            need[c]++;
        }

一個用來存儲窗口window中的字符,從頭開始遍歷,當window[c]==need[c]時,match++

match==need.size()時  更新長度

class Solution {
public:
    string minWindow(string s, string t) {
        if(s.size()<t.size()) return "";
        int start = 0,minlen = INT_MAX;
        map<char,int> need;
        map<char,int> window;
        for(char c:t){
            need[c]++;
        }
        int match = 0;
        int left=0,right=0;
        while(right<s.size()){
            char c1 = s[right];
            if(need.count(c1)){
                window[c1]++;
                if(window[c1]==need[c1]){
                    match++;
                }
            }
            right++;
            while(match==need.size()){
                if(right-left<minlen){
                    minlen = right-left;
                    start =  left;
                }
                char c2 = s[left];
                if(need.count(c2)){
                    window[c2]--;
                    if(window[c2]<need[c2]){
                        match--;
                    }
                }
                left++;
            }
        }
        return minlen == INT_MAX ?  "":s.substr(start,minlen);
    }
};


 

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