---
# System prepended metadata

title: Sliding Window (貪食蛇字串切割法)

---

# Sliding Window (貪食蛇字串切割法)

leetcode problem 76: Minimum Window Substring

以例子來說明題目。
Example 1:
Input: s = "ADOBECODEBANC", t = "ABC"
Output: "BANC"
Explanation: The minimum window substring "BANC" includes 'A', 'B', and 'C' from string t.

## 解法
![](https://i.imgur.com/DtGSPU3.jpg)

用兩個變數i, j來迭代s。其中i負責增長貪食蛇的身體，直到全身都包含t。這時代表找到了一個substring是包含t的，但它不一定是最小的。因此紀錄len和起始index之後要繼續找下去。移動j來縮短貪食蛇的身體，若減少的字元包含在t中，代表減少了這個字元，該substring將不再是一組解。因此我們要再移動i來增長身體。這樣不斷地增加和減少substring長度，就像貪食蛇的身體會增加和縮短一樣。

而s中的字元是否包含在t中，都用一個cnt陣列和一個total變數來做判斷。詳見以下code。

## Code
```
class Solution {
public:
    string minWindow(string s, string t) {
        int cnt[128];
        memset(cnt,0,sizeof(cnt));
        int s_len = s.size();
        int t_len = t.size();
        
        for(int i=0;i<t_len;++i){
            cnt[t[i]]++;
        }
        
        int total = t_len;
        int sub_len = 9999999;
        int sub_idx = -1;
        for(int i=0,j=0;i<s_len;++i){
            // i goes first
            cnt[s[i]]--;
            if(cnt[s[i]] >= 0){
                total--;
            }
            // j goes after i
            while(total == 0){
                if(i - j + 1 < sub_len){
                    sub_len = i - j + 1;
                    sub_idx = j;
                }
                if(cnt[s[j]] == 0){
                    total++;
                }
                cnt[s[j]]++;
                j++;
            }
        }
        
        return sub_idx == -1 ?  "" : s.substr(sub_idx, sub_len);
    }
};
```


