Problem
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).
Algorithm
Using a queue save the interval when visit s from left to right.
If there are more same characters than t in the queue, pop the left elements.
Code
class Solution:
def minWindow(self, s: str, t: str) -> str:
slen = len(s)
tlen = len(t)
in_t_flag = [0] * 128
for i in range(tlen):
index = ord(t[i])
in_t_flag[index] += 1
ans_len = slen+1
ans_L = 0
ans_R = 0
Q = [0] * slen
Q_l = 0
in_Q_flag = [0] * 128
for i in range(slen):
Q[i] = i
index = ord(s[i])
if in_t_flag[index]:
in_Q_flag[index] += 1
index = ord(s[Q_l])
while Q_l < i and (in_t_flag[index] == 0 or in_Q_flag[index] > in_t_flag[index]):
if in_Q_flag[index] > in_t_flag[index]:
in_Q_flag[index] -= 1
Q_l += 1
index = ord(s[Q_l])
flag = 1
for j in range(30, 128):
if in_Q_flag[j] < in_t_flag[j]:
flag = 0
break
if flag and ans_len > i - Q_l + 1:
ans_len = i - Q_l + 1
ans_L = Q_l
ans_R = i
if ans_len > slen:
return ""
else:
return s[ans_L:ans_R+1]