April——76. 最小覆盖子串

35 篇文章 0 订阅
26 篇文章 0 订阅

class Solution:
    def minWindow(self, s: str, t: str) -> str:
        if s==t:
            return s
        right = 0
        left = 0
        start = 0
        win_max = float('inf')
        dic = defaultdict(int)
        for char in t:
            dic[char]+=1
      
        def help(dic):
            for v in dic.values():
                if v>0:
                    return False
            return True
        while right<len(s):
            if s[right] in dic:
                dic[s[right]]-=1
            right+=1
            #检查是不是t的字符串已经被全部覆盖了
            while help(dic):
                #更新窗口的最大值和左边界
                if right-left<win_max:
                    win_max = right-left
                    start = left
                #缩小窗口,也就是减小左边界。
                #如果左边的值在字典中,就给它加1,然后向右移动左指针即可
                #如果不在字典中直接移动左指针就好
                if s[left] in dic:
                    dic[s[left]]+=1
                left+=1
        #如果窗口的最大值是小于等于字符串s
        #返回当前覆盖的最小字符串
        if win_max<=len(s):
            return s[start:start+win_max]
        return ''

        

 总结:处理字符串大多时候需要双指针,覆盖字符串的题目中可以使用hash表去存储目标字符串的字符。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值