解题思路-leetcode第七十六题:最小覆盖子串
题目描述:
给你一个字符串 S、一个字符串 T 。请你设计一种算法,可以在 O(n) 的时间复杂度内,从字符串 S 里面找出:包含 T 所有字符的最小子串。
示例:
输入:S = “ADOBECODEBANC”, T = “ABC”
输出:“BANC”
提示:
如果 S 中不存这样的子串,则返回空字符串 “”。
如果 S 中存在这样的子串,我们保证它是唯一的答案。
解题思路:
本题采用滑动窗口的方法解题,当窗口内元素不包含目标字符串全部元素时,则窗口向右加1,若窗口内元素包含目标字符串全部元素时,记录此时窗口包含字符串,然后记录此时窗口长度为min_length,然后窗口左端减1,继续上述判断。对于如何判断目标字符串元素是否全部包含在当前窗口内,采用字典计数的方法,先初始化一个字典dic,然后将目标字符串的元素分别作为key,存入字典,出现次数作为value存入字典,并记下目标字符串的总长度为count,在滑动过程中,每遇到目标字符串内元素,就将字典内对应元素的value减1,直至count为0。在窗口左端减1时,若遇到字典中存在的元素,则将字典中元素的value和count都加1。代码如下:
class Solution:
def minWindow(self, s: str, t: str) -> str:
from collections import defaultdict
dic = defaultdict(int)
for c in t:
dic[c] += 1
start = 0
end = 0
min_length = len(s) + 1
counter = len(t)
res = ""
while end < len(s):
if dic[s[end]] > 0:
counter -= 1
dic[s[end]] -= 1
end += 1
while counter == 0:
if min_length > end - start:
min_length = end - start
res = s[start:end]
if dic[s[start]] == 0:
counter += 1
dic[s[start]] += 1
start += 1
return res
提交后,通过。