76. Minimum Window Substring

1.問題

  • 給予字串S, T, 尋找S的最小罩窗可以涵蓋T的所有字母

2.想法

  • 提問:

  • function header, parameter

  • test input

  • 說明想法

    • 統計t的字母出現個數

    • 移動右邊界, 當t的字母全出現時, 移動左邊界, 一面紀錄最小邊界

  • 測試計算複雜度

3.程式碼

class Solution {
public:
    string minWindow(string s, string t) {
        unordered_map<char, int> cnt;
        for (char c : t) {
            cnt[c]++;
        }
        
        string res = "";
        int letterCnt = 0, minLen = INT_MAX, left = 0;
        for (int i = 0; i < s.length(); i++) {
            //移動右邊界, 當涵蓋範圍中目標字母的數量等於t的長度時, 開始縮減左邊界
            if (--cnt[s[i]] >= 0) {
                letterCnt++;
            }
            
            while (letterCnt == t.length()) {
                int len = i - left + 1;
                //計算距離最小距離, 如果比之前小就紀錄距離
                if (len < minLen) {
                    minLen = len;
                    res = s.substr(left, minLen);
                }
                //縮減左邊界, 當縮減時各數少了, 讓長度減一
                if (++cnt[s[left]] > 0) {
                    letterCnt--;
                }
                
                left++;
            }
        } 
        
        return res;
    }
};

Last updated