最小覆盖子串

问题描述
 给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。

示例:

输入: S = "ADOBECODEBANC", T = "ABC"
输出: "BANC"

问题思考:
 要解决这个问题,要用到滑动窗口的知识————就是先在S中找到一个窗口,该窗口包含字符串T,然后更新窗口、移动窗口,每次操作时,更新最小窗口长度和子串。
具体步骤请看下面的注释:

class Solution:
    def minWindow(self, s: str, t: str) -> str:
                    
        from collections import defaultdict
        lookup = defaultdict(int) #构造一个字典
        for c in t:
            lookup[c] += 1         #该字典存储t中的字母:次数
        start = 0
        end = 0
        min_len = float("inf")
        counter = len(t)
        res = ""
        while end < len(s):         #遍历s
            if lookup[s[end]] > 0:  #如果该字母在t中
                counter -= 1        #将该字母取出
            lookup[s[end]] -= 1     #对应位置减一
            end += 1                #末尾位置后移
            while counter == 0:             #当t中的字符已经全部包含
                if min_len > end - start:   #保存start:end的字符串
                    min_len = end - start
                    res = s[start:end]
                if lookup[s[start]] == 0:   #如果lookup[s[start]]是0,说明该位置字母是t中的某个字符,因为如果不是则是-1
                    counter += 1            #将该字母放进 lookup中
                lookup[s[start]] += 1       #对应位置减一
                #如果初始位置是t中的字符,继续第一个while循环,寻找到可以替代该字符的位置,如果长度更小,更新res
                #如果不是,会执行完第一个while后,直接执行第二个while,更新res
                start += 1                  #开始位置前移
        return res

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-window-substring

你可能感兴趣的:(最小覆盖子串)