1. 思路
要求时间复杂度为O(n),可以定义两个指针i,j,指针i从左向右移动,当找到所有的T时i停止,开始移动指针j,当j的下一次移动使得s[j:i+1]没有包含T时停止,最后判断找到的i+1-j长度是不是最小的,即找到所谓的最小窗口。想法很简单,关键是找到一个数据结构表达T有没有“找全”,并且判断是否找到T的元素。
可以定义一个变量counter统计剩余需要找到的T中元素的个数,同时还要判断是否找到一个有效T中的元素,也就是说T中的元素找多了也没用。定义另一个数组count统计每个元素需要被找到的个数(可能为负,负数表示多找多了)。i移动时count元素值作减一操作,表示已经找到了;j移动时作加一操作,表示i找到的让j给丢掉了,请i再找一次。
2. AC代码
class Solution(object):
def minWindow(self, s, t):
"""
:type s: str
:type t: str
:rtype: str
"""
count = [0 for _ in range(128)]
for i in t:
count[ord(i)] += 1
counter = len(t)
res_len = float('inf')
res = ''
j = 0
for i in range(len(s)):
if count[ord(s[i])] > 0:
counter -= 1
count[ord(s[i])] -= 1
while(counter==0):
if i - j + 1 < res_len:
res_len = i - j + 1
res = s[j:i+1]
count[ord(s[j])] += 1
if count[ord(s[j])] > 0:
counter += 1
j += 1
return res