###### tags: `leetcode` # 76. Minimum Window Substring ## Counter() ```python= def minWindow(self, s: str, t: str) -> str: t_count = collections.Counter(t) window_count = {} l, r = 0, 0 num_of_hits = 0 ans = (float("inf"), None, None) while r < len(s): window_count[s[r]] = window_count.get(s[r], 0) + 1 if window_count[s[r]] <= t_count[s[r]]: # not exceeding, still useful conts num_of_hits += 1 # num_of_hits is enough, record a candidate and try to shrink size while l <= r and num_of_hits == len(t): if r - l + 1 < ans[0]: ans = (r - l + 1, l, r) window_count[s[l]] -= 1 if window_count[s[l]] < t_count[s[l]]: # num_of_hits is reduced only if we have less than `t` num_of_hits -= 1 l += 1 r += 1 if ans[0] == float("inf"): return '' return s[ans[1]:ans[2]+1] ``` ## filtering ```python= def minWindow(self, s: str, t: str) -> str: t_count = collections.Counter(t) filtered_s = [] for i_ele in enumerate(s): if i_ele[1] in t_count: filtered_s.append((i_ele)) window_count = {} l_filtered_s, r_filtered_s = 0, 0 num_of_hits = 0 ans = (float("inf"), None, None) while r_filtered_s < len(filtered_s): ch = filtered_s[r_filtered_s][1] window_count[ch] = window_count.get(ch, 0) + 1 if window_count[ch] <= t_count[ch]: # not exceeding, still useful conts num_of_hits += 1 # num_of_hits is enough, record a candidate and try to shrink size while l_filtered_s <= r_filtered_s and num_of_hits == len(t): ch = filtered_s[l_filtered_s][1] l_s = filtered_s[l_filtered_s][0] r_s = filtered_s[r_filtered_s][0] if r_s - l_s + 1 < ans[0]: ans = ( r_s - l_s + 1, l_s, r_s) window_count[ch] -= 1 if window_count[ch] < t_count[ch]: # num_of_hits is reduced only if we have less than `t` num_of_hits -= 1 l_filtered_s += 1 r_filtered_s += 1 if ans[0] == float("inf"): return '' return s[ans[1]:ans[2]+1] ```