Can someone explain how this is O(n) when youβre doing string slice inside while loop? Each slide operation is O(n) so the whole algorithm should be at least O(n^2) ?
target = Counter(check)
window = Counter(original[:len_check])
l, r = 0, len_check-1
while r < len_original:
if is_sub_counter(target, window):
# 1. check for new min
currlen = r - l + 1
currstr = original[l:l + currlen]
if currlen < minlen or currlen == minlen and currstr < minsubstr:
minlen = currlen
minsubstr = currstr
# 2. remove current l from window
window[original[l]]-=1
# 3. advance l
l+=1
else:
# 1. advance r
r+=1
# 2. add new r to window if possible
if r < len_original:
window[original[r]]+=1
return minsubstr
+1, yeah and space is O(n+k) maybe? so many substrings created there for comparison and each comparison is O(min(x,y)) which could be n, so time really is O(n^2)β¦ ?
# WRITE YOUR BRILLIANT CODE HERE
if len(check) > len(original): return ""
m, n = len(original), len(check)
ans = [-m-1, 0]
def is_smaller(window_a, window_b):
len_a = window_a[1] - window_a[0] + 1
len_b = window_b[1] - window_b[0] + 1
if len_a == len_b:
a = original[window_a[0]:window_a[1]]
b = original[window_b[0]:window_b[1]]
return a < b
else:
return len_a < len_b
d_check = Counter(check)
required = len(d_check.keys())
satisfied = 0
d = defaultdict(int)
left = 0
for right in range(m):
if original[right] in d_check:
d[original[right]] += 1
if d[original[right]] == d_check[original[right]]:
satisfied += 1
while required == satisfied:
if is_smaller([left,right+1], ans):
ans = [left, right+1]
if original[left] in d_check:
d[original[left]] -= 1
if d[original[left]] < d_check[original[left]]:
satisfied -= 1
left += 1
return original[ans[0]:ans[1]]
My Python answer
from collections import Counter
def get_minimum_window(original: str, check: str) β str:
# WRITE YOUR BRILLIANT CODE HERE
def checkifvalid(checkmap,tempstring):
tempmap=dict(Counter(tempstring))
for key in checkmap.keys():
if key not in tempmap:
return False
if tempmap[key]<checkmap[key]:
return False
return True
if len(check)>len(original):
return ""
n=len(original)
checkmap=dict(Counter(check))
slow=0
fast=0
found=0
anslen=n
ans=original
tempstring=str()
while fast<n:
tempstring=original[slow:fast+1]
if checkifvalid(checkmap,tempstring):
if fast-slow+1 < anslen or ( fast-slow+1==anslen and tempstring<=ans):
anslen=fast-slow+1
ans=tempstring
found=1
tempstring=tempstring[1:]
slow+=1
else:
fast+=1
if found==0:
return ""
return ans
if name == βmainβ:
original = input()
check = input()
res = get_minimum_window(original, check)
print(res)