【LeetCode】76. 最小覆盖子串

15 篇文章 0 订阅
1 篇文章 0 订阅

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

注意:

对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。
如果 s 中存在这样的子串,我们保证它是唯一的答案。
 

示例 1:

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

输入:s = "a", t = "a"
输出:"a"
示例 3:

输入: s = "a", t = "aa"
输出: ""
解释: t 中两个字符 'a' 均应包含在 s 的子串中,
因此没有符合条件的子字符串,返回空字符串。
 

提示:

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

题解:

这道题主要通过滑动窗口+字符计数进行解决,搞了好久,之前用count来计数,但是超时了,卡在最后一个用例,(最后一个用例超级长),所以重新优化下,终于通过了。

class Solution:
    def minWindow(self, s: str, t: str) -> str:
        if len(s)<len(t):
            return ""
        else:
            left=0
            n=len(s)
            length=n+1
            lt=len(t)
            i=lt-1
            result=''
            dict=self.co(t)
            dics=self.co(s[0:lt])
            while i<n:
                ans=s[left:i+1]
                if len(ans)<lt:
                    i+=1
                    if i<n:
                        dics[s[i]]+=1
                elif self.fun(dict,dics):
                    if length>len(ans):
                        result=ans
                        length=len(ans)
                    dics[s[left]]-=1
                    left=left+1
                else:
                    i+=1
                    if i<n:
                        dics[s[i]]+=1
        return result
    
    def fun(self,dict,dics):
        for i in dict:
            if i not in dics or dict[i]>dics[i]:
                return False
        return True
    
    def co(self,mm):
        dict={}
        x="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
        for i in x:
            if i not in dict:
                dict[i]=0

        for i in mm:
                dict[i]+=1
        return dict

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值