76.Minimum Window Substring
Tags: [string], [two_pointer], [map], [window], [shrink_window]
Com: {fb}
Link: https://leetcode.com/problems/minimum-window-substring/\#/description
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 empty string""
.
If there are multiple such windows, you are guaranteed that there will always be only one unique minimum window in S.
Solution: Two Pointers, Shrink Window
class Solution(object):
def minWindow(self, s, t):
"""
:type s: str
:type t: str
:rtype: str
"""
if not s or not t or len(s) < len(t):
return ''
num_of_missing_chars = 0
need_chars = {}
for c in t:
num_of_missing_chars += 1
if c not in need_chars:
need_chars[c] = 1
else:
need_chars[c] += 1
min_win_size = len(s) + 1
min_win_start = -1
min_win_end = -1
start = 0
end = 0
while end < len(s):
curr = s[end]
if num_of_missing_chars > 0:
# continue moving the end pointer to right, to collect more chars.
if curr in need_chars:
if need_chars[curr] > 0:
num_of_missing_chars -= 1
need_chars[curr] -= 1
if num_of_missing_chars == 0:
# shrink the window, by moving the start pointer to right.
while start <= end:
curr_start = s[start]
if curr_start in need_chars:
if need_chars[curr_start] == 0:
break
elif need_chars[curr_start] < 0:
need_chars[curr_start] += 1
start += 1
curr_win_size = end - start + 1
if curr_win_size < min_win_size:
min_win_size = curr_win_size
min_win_start = start
min_win_end = end
num_of_missing_chars += 1
need_chars[s[start]] += 1
start += 1
end += 1
if min_win_start < 0:
return ''
else:
return s[min_win_start:min_win_end + 1]
Revelation:
- Do not try to recall the previous problem, meet one problem, just use the current knowledge to solve it.
- The 'num_of_missing_chars' is recording the real number of chars we still need.
- The value of need_chars[c] can be positive, zero and negative. If the value is negative, it means you have collected more chars than you need in the current window.
Note:
- Time complexity = O(n), n is the length of the given string s.