LeetCode 76 最小覆盖子串

LeetCode 76 最小覆盖子串

最小覆盖子串

题目描述

题目描述:给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。

示例:

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

说明:

  • 如果 S 中不存这样的子串,则返回空字符串 ""
  • 如果 S 中存在这样的子串,我们保证它是唯一的答案。

题解

这题属于滑动窗口类型。思路简单来说就是,用start、end控制一个滑动窗口。当滑动窗口中未包含所有T中字符,end右移;当滑动窗口中包含所有T中字符时,start右移。统计包含T中所有字符时(即start开始右移时),滑动窗口的最小长度,并记录长度最小时候的子串。

class Solution:
    def minWindow(self, s: str, t: str) -> str:
        from collections import defaultdict
        occ = defaultdict(int) #occ记录滑动窗口中的字符情况
        for c in t:
            occ[c] += 1
        #用start和end表示一个滑动窗口的开始和结尾
        #cnt记录滑动窗口中 不包含 T中字符的个数
        #minlen记录包含T中所有字符时 滑动窗口的最小长度
        start, end, cnt, minlen = 0, 0, len(t), float("inf")
        res = ""
        while end < len(s):
            if occ[s[end]] > 0:
                cnt -= 1
            occ[s[end]] -= 1
            end += 1 
            while cnt == 0:
                if minlen > end - start:
                    minlen = end - start
                    res = s[start:end]
                if occ[s[start]] == 0:
                    cnt += 1
                occ[s[start]] += 1
                start += 1 
        return res
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值