76. 最小覆盖子串

给你一个字符串 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 由英文字母组成
 

进阶:你能设计一个在 o(n) 时间内解决此问题的算法吗?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-window-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

wa

class Solution:
    def minWindow(self, s: str, t: str) -> str:
        ls=len(s)
        lt=len(t)
        if ls<lt:return ''
        if s==t:return s

        def check(a,b):
            cnta=collections.Counter(a)
            cntb=collections.Counter(b)
            for i in cntb.keys():
                if i not in cnta.keys():
                    return False
                else:
                    if cnta[i]<cntb[i]:
                        return False   
            return True
        if ls==lt:return s if check(s,t) else ''
        if not check(s,t):return ''
        l,r=0,ls

        while l<r:
            if check(s[l+1:r],t):
                l+=1
            elif check(s[l:r-1],t):            
                r-=1
            else:
                res1=s[l:r]
                break
        l,r=0,ls
        while l<r:
            if check(s[l:r-1],t):
                r-=1
            elif check(s[l+1:r],t):            
                l+=1
            else:
                res2=s[l:r]
                break
        return res1 if len(res1)<len(res2) else res2

ac

class Solution:
    def minWindow(self, s, t):
        cnt=collections.Counter(t)
        lt=len(t)
        start=0
        minSize=99999
        l=0
        for end in range(len(s)):
            if s[end] in cnt:
                cnt[s[end]]-=1
                if cnt[s[end]]>=0:
                    lt-=1
            if lt==0:
                while True:
                    if s[start] in cnt:
                        if cnt[s[start]]<0:
                            cnt[s[start]]+=1
                        else:
                            break
                    start+=1
                if minSize>end-start+1:
                    minSize=end-start+1
                    l=start
        return '' if minSize==99999 else s[l:l+minSize]

 

posted @ 2020-11-15 12:13  XXXSANS  阅读(87)  评论(0编辑  收藏  举报