43 lines
1.6 KiB
Python
43 lines
1.6 KiB
Python
|
from collections import Counter
|
||
|
|
||
|
class Solution:
|
||
|
def minWindow(self, s: str, t: str) -> str:
|
||
|
tcounts = Counter(t)
|
||
|
|
||
|
# If chars of t is not included in the entire
|
||
|
# s string, then we can just return right away
|
||
|
if not tcounts <= Counter(s):
|
||
|
return ""
|
||
|
|
||
|
tlen = len(t)
|
||
|
min_window = ""
|
||
|
|
||
|
for start in range(len(s)):
|
||
|
end = start + tlen - 1
|
||
|
|
||
|
# We can all the substrings starting from `start` which is every
|
||
|
# letter of s
|
||
|
while end < len(s):
|
||
|
curr_window = s[start:end + 1]
|
||
|
curr_window_counts = Counter(curr_window)
|
||
|
|
||
|
# <= is overloaded for Counters to mean inclusion
|
||
|
#
|
||
|
# i.e, counter_a -is-included-in- counter_b
|
||
|
#
|
||
|
if tcounts <= curr_window_counts:
|
||
|
# If no min_window has been computed yet or if current
|
||
|
# window is shorter, then we assign that as the new
|
||
|
# min_window
|
||
|
if min_window == "" or len(curr_window) < len(min_window):
|
||
|
min_window = curr_window
|
||
|
|
||
|
# Since at this point, if we keep iterating in the inner loop,
|
||
|
# we'll only get longer substrings so we just break and proceed
|
||
|
# to find the substrings starting from the next letter (start + 1)
|
||
|
break
|
||
|
|
||
|
end += 1
|
||
|
|
||
|
return min_window
|