zoukankan      html  css  js  c++  java
  • 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]
  • 相关阅读:
    【转】利用Python将多个PDF合并为一个
    sudo配置教程
    tomcat查看并修改jvm大小
    jetty隐藏版本号教程
    weblogic为同一domain下的不同server添加不同参数
    Oracle使用expdp/impdp导出导入数据
    Windows设置.txt文件默认打开程序
    weblogic查看版本号教程
    Linux登录超时自动退出处理办法
    telnet强制中断登录
  • 原文地址:https://www.cnblogs.com/xxxsans/p/13976302.html
Copyright © 2011-2022 走看看