包含字符串所有字母的最小子串

题目描述:

给定一个字符串 S 和一个字符串 T,请在 S 中找出包含 T 所有字母的最小子串。(minimum-window-substring)

示例:

输入: S = "ADOBECODEBANC", T = "ABC"
输出: "BANC"

思路:

  窗口长度不固定,先固定窗口左端,移动右端,直到找到满足条件的窗口,记录窗口长度及对应窗口;
  然后固定右端,移动左端,选择最小窗口长度及对应窗口,直到窗口重新不满足条件,再开始移动右端
  到右端在最右端且窗口不满足条件,此时最小窗口长度的对应窗口即所需字串

代码:

def minWindow(s,t):
    #把t的字符存储为字典的形式,也记录窗口内各个字符缺的个数
    dict_map={}
    for i in t:
        if i in dict_map:
            dict_map[i]+=1
        else:
            dict_map[i]=1
    # 窗口左端
    left = 0
    #窗口右端
    right=0
    #选定窗口字符串还需满足几个字符就包含待定字符串了
    count=len(t)
    #记录包含待定字符串的字符串的长度,方便找出最短的那个
    length=len(s)
    #最终结果
    res='找不到'

    #开始时左端为0,右端依次增大
    while right<len(s):
        #右端字符包含待定字符串的字符时
        if s[right] in dict_map:
            #字典里该字符对应的值大于0时说明该字符在窗口内还未全部出现
            if dict_map[s[right]]>0:
                count-=1
            #字典字符若为负数,则说明有字符多出现了,有可能减小窗口
            # 如AABC包含ABC的最小窗口为ABC,第一次count=0时dict_map={'A':-1,'B':0,'C':0,}
            dict_map[s[right]]-=1
        right+=1

        #找到包含待定字符串的字符后,开始移动左端
        while count==0 or left==len(s):
            #若新窗口的长度小于之前最小长度的窗口,则替换掉
            if length>right-left:
                length=right-left
                res=s[left:right]
            #当左端字符在待定字符串t里时,有可能新窗口不完全包含t了
            if s[left] in dict_map:
                dict_map[s[left]]+=1
                #当字典内某字符的值大于1时,表示窗口又缺该字符了
                if dict_map[s[left]]>0:
                    #缺的字符数加1
                    count+=1
            left+=1
    return res



s = "ADOBECODEBANC"
t = "ABC"
print(minWindow(s,t))
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值