题目分析:
这一题是给我们S和T两个串,让我们找在 S 中找出包含 T 所有字母的最小子串。解决这种题目的方法叫滑动窗口,很多子串,子数组,子序列等等的问题都是依靠这个方法解决的。
解题思路:
- 首先要知道T中所包含的字母元素及其个数(dict,字典解决)
- 使用左右指针再S中找到一个包含T中所有元素的字串
- 使用左指针缩小范围,更新min_len
- 移动左指针时如果该元素存在就加回来
map[s[left]] += 1
,如果加后值大于0了说明字串缺少元素了把长度减一if map[s[left]] > 0: count -= 1
,开始移动右指针。 - 参考博客说的更清楚
测试代码:(Runtime: 96 ms, faster than 92.99 % )
class Solution:
def minWindow(self, s, t):
res , map = '', {}
left, count, min_len = 0, 0, len(s) + 1
for c in t:
map[c] = map.get(c, 0) + 1
for i in range(len(s)):
if s[i] in map:
map[s[i]] -= 1
if map[s[i]] >= 0:
count += 1
while count == len(t):
if min_len > i - left + 1:
min_len = i - left + 1
res = s[left: i + 1]
if s[left] in map:
map[s[left]] += 1
if map[s[left]] > 0:
count -= 1
left += 1
return res
print(Solution().minWindow("ADOBECODEBANC", "ABC")) #提交时请删除该行