###### tags: `Leetcode` `hard` `sliding window` `python` `Top 100 Liked Questions`
# 76. Minimum Window Substring
## [題目連結:] https://leetcode.com/problems/minimum-window-substring/
## 題目:
Given two strings s and t of lengths m and n respectively, return the **minimum window substring** of s such that every character in t (**including duplicates**) is included in the window. If there is no such substring, return the empty string "".
The testcases will be generated such that the answer is **unique**.
A **substring** is a contiguous sequence of characters within the string.
**Follow up: Could you find an algorithm that runs in O(m + n) time?**
**Example 1:**
```
Input: s = "ADOBECODEBANC", t = "ABC"
Output: "BANC"
Explanation: The minimum window substring "BANC" includes 'A', 'B', and 'C' from string t.
```
**Example 2:**
```
Input: s = "a", t = "a"
Output: "a"
Explanation: The entire string s is the minimum window.
```
**Example 3:**
```
Input: s = "a", t = "aa"
Output: ""
Explanation: Both 'a's from t must be included in the window.
Since the largest window of s only has one 'a', return empty string.
```
## 解題想法:
* 要求在s中找出**包含t所有字符**的**最短連續字串**
* 因為要求O(N)時間,往雙指針去想
* **Sliding window** 💪
* 額外需要: 字典存t的字符與其出現的次數
* **Step1:** tail逐一往右遍歷
* **Step2:** curSum紀錄在head~tail區間內包含t中元素的個數
* **Step3:** 當curSum==len(t)表示目前head~tail區間符合題目要求的區間,但不一定是最短區間
* **Step4:** 移動head,檢查是否還有機會縮小區間
* **Step5:** 若curSum!=len(t),則繼續**Step1**
## Python:
``` python=
from collections import defaultdict
class Solution(object):
def minWindow(self, s, t):
"""
:type s: str
:type t: str
:rtype: str
"""
dic=defaultdict(int)
for val in t:
dic[val]+=1
head=0
tail=0
minLen=float('inf') #區間長
res=""
curSum=0 #當前區間包含t元素的數量
while tail<len(s):
dic[s[tail]]-=1
#若為負,表示不在t中or超過t中該char的數量
if dic[s[tail]]>=0:
curSum+=1
while curSum==len(t):
#更新長度
if minLen>(tail-head+1):
minLen=tail-head+1
res=s[head:tail+1]
#移動head
dic[s[head]]+=1
#大於0代表 刪掉的是t中的元素
if dic[s[head]]>0:
curSum-=1
head+=1
tail+=1
return res
if __name__=='__main__':
result=Solution()
ans=result.minWindow(s = "ADOBECODEBANC", t = "ABC")
print(ans)
```