LC076 - Minimum Window Substring
Problem
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.
Example
Input: s = "ADOBECODEBANC", t = "ABC"
Output: "BANC"
Explanation: The minimum window substring "BANC" includes 'A', 'B', and 'C' from string t.
Solution
Use a hash map to compare number of target characters in current window to target. Progressively decrease window size and shift right after finding a match. This solution is done in linear time and uses extra space.
def minWindow(self, s: str, t: str) -> str:
if t == "":
return ""
req = {}
cur = {}
# Can use collections.Counter for this
for char in t:
if char in req:
tmp = req[char]
req[char] = tmp + 1
else:
req[char] = 1
reqN = len(req)
curN = 0
res = [0,-1]
resLen = math.inf
left = 0
for right in range(len(s)):
char = s[right]
if char in cur:
tmp = cur[char]
cur[char] = tmp + 1
else:
cur[char] = 1
if char in req and cur[char] == req[char]:
curN += 1
# if window is smaller, then update smallest window size
while reqN == curN:
if (right - left + 1) < resLen:
res = [left, right]
resLen = (right - left + 1)
# remove the leftmost char of current window
cur[s[left]] -= 1
if s[left] in req and cur[s[left]] < req[s[left]]:
curN -= 1
left += 1
left, right = res
if resLen != math.inf:
return s[left:right+1]
else:
return ""
Last updated