76. 最小覆盖子串 Leetcode Python 滑动窗口解法

题目:给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。

注意:如果 s 中存在这样的子串,我们保证它是唯一的答案。

示例 1:

输入:s = "ADOBECODEBANC", t = "ABC"
输出:"BANC"
示例 2:

输入:s = "a", t = "a"
输出:"a"
 

提示:

1 <= s.length, t.length <= 105
s 和 t 由英文字母组成

题解代码:

class Solution:
    def minWindow(self, s: str, t: str) -> str:
        need = {}   # t 中字符个数转化为dict
        window = {}   # 记录窗口数据

        # 初始化需要的结果字典
        for i in t:
            if  i in need:
                need[i]+= 1
            else:
                need[i] = 1

        left,right = 0,0 # 两个指针
        valid = 0  # 记录有多少个符合t字符串的字符进入到了窗口中

        start,lenght = 0 , float("inf") # 初始化结果, start 表示字串开始,lenght表示最短子串个数
        while(right<len(s)):
            s_str = s[right]
            right += 1
            if s_str not in window:
                window[s_str] = 1
            else:
                window[s_str] += 1
            if s_str in  need:
                if window[s_str] == need[s_str]: # windows 中记录的个数与need 中记录的个数相等,说明这个字符已经满足条件
                    valid += 1 
           
            # 当valid == len(need) 之后开始left 开始右移动,减小窗口
            while (valid == len(need)):
              
                if  right - left < lenght : # 记录字串起始位置与长度
                    start = left
                    lenght = right - left
                    
                d = s[left];
                left+=1   # left 右移
                if d in need:
                    if (window[d] == need[d]):  # 如果移出去的字符刚好符合need 则left 右移后字串不符合条件。
                        valid -=1
                    window[d] -= 1 # 在窗口中将移出去的字符数减1
      
        return ""  if lenght == float("inf") else s[start:lenght+start]

                
原文地址:https://www.cnblogs.com/huangguifeng/p/14193704.html