LeetCode--Minimum Window Substring(最小匹配子串)

題意:Given a string S and a string T, find the minimum window in S which will contain all the characters in T in complexity O(n).

For example,
S = “ADOBECODEBANC”
T = “ABC”
Minimum window is “BANC”.

Note:
If there is no such window in S that covers all characters in T, return the emtpy string “”.

If there are multiple such windows, you are guaranteed that there will always be only one unique minimum window in S.

題解:使用兩個指針,其間的字符代表窗口字符串,則當窗口內字符覆蓋了t,則我們移動左指針看能不能減小窗口仍然達到要求;如果窗口未覆蓋t,則我們移動右指針,添加字符直到覆蓋t。
其中使用了兩個hash數組分別代表t中字符的個數,以及窗口中字符的個數。

代碼如下:

class Solution {
public:
    string minWindow(string s, string t) {
        string ans("");
        if(s.size() == 0 || t.size() == 0) return ans;
        vector<int> charToNum(128, 0);
        vector<int> tmpCharToNum(128, 0);

        for(int i = 0;i < t.size();i++) {
            //記錄t中字符頻度
            charToNum[t[i]]++;
            tmpCharToNum[t[i]] = 0;
        }

        int sumMatchNum = 0;    //窗口中總的匹配數
        int left = -1;
        int right = -1;
        int sSize = s.size();
        int tSize = t.size();
        while(right < sSize) {
            //當right = sSize-1時,left仍然可以向右移動
            if(sumMatchNum < tSize) {
                right++;
                //最終返回條件
                if(right == sSize) break;
                char tmp = s[right];
                if(charToNum[tmp] && (++tmpCharToNum[tmp]) <= charToNum[tmp]) {
                    //如果字符在t中存在,並且從left+1到right形成的字符串中
                    //含有的tmp的個數小於等於t中個數,則匹配數加加
                    sumMatchNum++;
                }
            }
            else {
            //進入這說明sumMatchNum == tSize
                left++;
                char tmp = s[left];
                if(charToNum[tmp] && (--tmpCharToNum[tmp]) < charToNum[tmp]) {
                    //如果字符在t中存在,並且從left+1到right形成的字符串中
                    //含有的tmp的個數小於了t中個數,則匹配數減減
                    sumMatchNum--;
                }
            }
            if(sumMatchNum == tSize && (right -left < ans.size() || ans.size() == 0)) {
                ans = s.substr(left+1, right-left);
            }
        }
        return ans;
    }
};
發佈了99 篇原創文章 · 獲贊 6 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章