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.
意思就是在S串中找到包含T串中所有字符的最短子串。
我的想法是找到每次遍历S中一个字符,保存每个T中字符在S中的最靠后的位置,如果新加入的字符和 第一个字符相同,就计算一个最短长度。
然而令我没想到的是T中字符是可以重复的。所以我得方法失败。
这里有一个答案,看代码思想差不多是:
保存一个区间[i,j],每次加入一个字符,如果区间包含T中所有的字符,就在不影响包含T中所有字符的条件情况下,从左边开始删除区间长度,计算长度和 最短长度比较。基本和我的那个方法差不多相同,O(n)复杂度,只不过它的方法更好实现。
代码如下,上面是我的,下面的是抄的(python)
class
Solution(
object):
def
minWindow(
self,
s,
t):
flag,index,minlength,minflag=
False,[-
1]*
len(t),
0,
True
for i
in
range(
len(s)):
if s[i]
in t:
word=t.index(s[i])
index[word]=i
if minflag:
minindex=word
if flag==
False:
findflag=
False
for each
in index:
if each<
0:
findflag=
True
break
if findflag==
False:
flag=
True
mins,mine=
min(index),i
minlength=mine-mins
if flag==
True:
if minindex==word:
j=
min(index)
minindex=index.index(j)
if i-j<minlength:
mins,mine,minlength=j,i,i-j
if flag:
return s[mins:mine+
1]
else:
return
""
S=
"ADOBG"
T=
"ADOBG"
ss=Solution()
print ss.minWindow(S,T)
def
minWindow(
self,
s,
t):
need, missing = collections.Counter(t),
len(t)
i = I = J =
0
for j, c
in
enumerate(s,
1):
missing -= need[c] >
0
need[c] -=
1
if
not missing:
while i < j
and need[s[i]] <
0:
need[s[i]] +=
1
i +=
1
if
not J
or j - i <= J - I:
I, J = i, j
return s[I:J]