双指针滑动窗口整理2——最小覆盖子串

接着上一篇 双指针滑动窗口整理——长度最小的子数组、水果成篮 继续整理。

题目:76. 最小覆盖子串

此题对于滑动窗口的思路其实与之前差不多,难点在于缩放窗口的条件

题意解读:

要点一

  1. 题目中说“*对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。”说明我们需要对t中字母及其个数进行记录,这里我们用字典requiredsub来表示。这也是我们求解的子串所需要包含的单词及其数量。
  2. 在遍历过程中,每次获得一个属于t的单词,就将requiredsub[s[j]] -= 1
  3. 当该字典中所有的字母的值为非正数的时候就是滑动窗口要缩放的时候。

要点二

那如何判断requiredsub中所有元素的值是负数呢?

我们设置了requiredlen,初始化为t的长度。当所求子串还需要更多包含t中元素的时候,(requiredsub[s[j]] > 0)的时候,requiredlen -= 1

  • requiredsub[k]是正数表示子串中还需要几个k元素。0则为不需要,负数则是过剩。

  • 我们举个例子来理解一下,比如s = 'aab' t = 'ab',当i = 0, j = 1requiredsub['a'] = 0,表示子串其实不再需要更多a,所以这时候requiredlen并不需要变化。

要点三

i需要需要变化的时候(向后移动),对于requiredsubrequiredlen有一个与要点二相反的变化。即先判断子串中包含t中的元素是否过剩(如果没有过剩,那么 requiredsub[s[i]] == 0)则requiredlen += 1

from collections import Counter
class Solution(object):
    def minWindow(self, s, t):

        minstring = ''
        minlen = len(s) + 1
        requiredsub = Counter(t) #记录需要单词的所需数目
        i = 0
        requiredlen = len(t)

        for j in range(len(s)):
            if s[j] in t:
                if requiredsub[s[j]] > 0: requiredlen -= 1 
                requiredsub[s[j]] -= 1
            while requiredlen == 0:
                curlen = j - i + 1
                if minlen > curlen:
                    minlen = curlen
                    minstring = s[i:j+1]
                if s[i] in t: 
                    if requiredsub[s[i]] == 0: requiredlen += 1
                    requiredsub[s[i]] += 1
                i += 1

        return minstring
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值