76.最小覆盖子串

76.最小覆盖子串_第1张图片
参考链接:简简单单,非常容易理解的滑动窗口思想
76.最小覆盖子串_第2张图片
76.最小覆盖子串_第3张图片

滑动窗口没想到

class Solution:
    def minWindow(self, s: str, t: str) -> str:
        left, right = 0, float('inf')
        needDict = collections.defaultdict(int)  # 对没出现的字典的字符,初始化为0
        for char in t:
            needDict[char] += 1
        needCount = len(t)
        lindex = 0 # 窗口的左边
        for index, char in enumerate(s):
        	# Step1
            if needDict[char] > 0: needCount -= 1 # >0的表示这是t中的字符,并且是缺货状态
            needDict[char] -= 1 # needDict中记录了当前窗口内出现的所有字符,以及对应的所需个数
            # if char in t: needCount -= 1 # 记录还需要涵盖的字符数目 X
			# Step 2
            if needCount == 0: # 表明此时已经囊括了所有所需字符,开始找最小的子串
                while True:
                    lchar = s[lindex]
                    if needDict[lchar] < 0: # 多余的字符,
                        lindex += 1 # 窗口左边收缩
                        needDict[lchar] += 1 # 窗口中出现的该字符数目加一,不用担心会把无关字符加一,因为记录的无关字符数目一定大于窗口左边收缩时遍历到的数目。
                    else:break # 如果needDict[lchar]已经=0了,就说明该字符不是多余的,再收缩窗口的话,就变成正数(还需要字符) 
                if index - lindex < right - left: # 更新最小覆盖子串
                    print('hello')
                    left = lindex
                    right = index
            
                # Step3 抛弃掉最左边的所需字符,重新开始,直到覆盖到下一个出现的该字符
                needDict[s[lindex]] += 1
                needCount += 1 
                lindex += 1 

        print('left,right:',left,right)
        return "" if right > len(s) - 1 else s[left: right+1]




            

你可能感兴趣的:(leetcode,算法,滑动窗口)