Leetcode76:最小覆盖子串

本文介绍了一种使用滑动窗口解决字符串匹配问题的方法。通过统计小字符串t中各字符出现次数并用计数器记录,算法能在大字符串s中找到包含t所有字符的最小子串。具体实现上,利用双向窗口进行左右移动,调整窗口大小,直至找到符合条件的最短匹配子串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本思路是先统计字符子串t中各个字符的个数need,然后通过滑动窗口来对字符串进行处理,当窗口中出现t中的字符时need-1。当need=0时,移动左边窗口,此时移除的字符若是t中的且该字符的计数>0(说明该窗口中还没包含足够的当前字符)时,need+1。

import collections
def minWindow(s: str, t: str) -> str:  #s大字符串 t小字符串
    cnt = collections.Counter(t)
    left = 0
    need = len(t) #用来记录t中还存在的字符个数
    min_lens = len(s)+1
    start,end = 0,0
    for i,x in enumerate(s):
        if x in cnt:  #这里主要是让窗口包含t中所有的字符 出现所需字符,数量就减少    如果滑到的字符在t里面
            if cnt[x] >0:  #如果滑到的字符在t里面,且所需个数>0
                need -= 1  #那么所需字符串个数-1
            cnt[x] -= 1    #重点:只要当前的字符在t里面,不管他还有几个需求,个数都会-1。这样就会出现字符个数为负数的情况
        while need == 0:   #这里主要是让左边窗口不断滑动
            if i-left+1 < min_lens:
                min_lens = i - left + 1
                start,end = left,i+1
            if s[left] in cnt:
                if cnt[s[left]] >= 0: #如果左边滑出去的字符个数在counter中>0,说明此时的窗口中包含该字符的数量还不够
                    need += 1
                cnt[s[left]] += 1 #只要字符是t中需要的,滑出去了数量就要+1
            left += 1
    return s[start:end]

leetcode76:最小覆盖子串

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值