解题思路-leetcode第七十六题:最小覆盖子串

解题思路-leetcode第七十六题:最小覆盖子串

题目描述:
给你一个字符串 S、一个字符串 T 。请你设计一种算法,可以在 O(n) 的时间复杂度内,从字符串 S 里面找出:包含 T 所有字符的最小子串。
示例:
输入:S = “ADOBECODEBANC”, T = “ABC”
输出:“BANC”
提示:
如果 S 中不存这样的子串,则返回空字符串 “”。
如果 S 中存在这样的子串,我们保证它是唯一的答案。

解题思路:
本题采用滑动窗口的方法解题,当窗口内元素不包含目标字符串全部元素时,则窗口向右加1,若窗口内元素包含目标字符串全部元素时,记录此时窗口包含字符串,然后记录此时窗口长度为min_length,然后窗口左端减1,继续上述判断。对于如何判断目标字符串元素是否全部包含在当前窗口内,采用字典计数的方法,先初始化一个字典dic,然后将目标字符串的元素分别作为key,存入字典,出现次数作为value存入字典,并记下目标字符串的总长度为count,在滑动过程中,每遇到目标字符串内元素,就将字典内对应元素的value减1,直至count为0。在窗口左端减1时,若遇到字典中存在的元素,则将字典中元素的value和count都加1。代码如下:

class Solution:
    def minWindow(self, s: str, t: str) -> str:
        from collections import defaultdict
        dic = defaultdict(int)
        for c in t:
            dic[c] += 1
        start = 0
        end = 0
        min_length = len(s) + 1
        counter = len(t)
        res = ""
        while end < len(s):
            if dic[s[end]] > 0:
                counter -= 1
            dic[s[end]] -= 1
            end += 1
            while counter == 0:
                if min_length > end - start:
                    min_length = end - start
                    res = s[start:end]
                if dic[s[start]] == 0:
                    counter += 1
                dic[s[start]] += 1
                start += 1
        return res

提交后,通过。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值