最小覆盖子串(Leetcode困难题,python解决)

这篇博客介绍了如何使用滑动窗口策略解决LeetCode中的一道困难题目——找到字符串的最小覆盖子串。通过详细阐述解题思路和提供代码实现,帮助读者理解滑动窗口在字符串处理问题中的应用。

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

题目描述:

解决思路:滑动窗口

1. 初始, left 指针和 right 指针都指向 S 的第一个元素 .
2. right 指针右移,扩张窗口,直到得到一个可行窗口,亦即包含 TT 的全部字母的窗口。
3. 得到可行的窗口后,将 left 指针逐个右移,若得到的窗口依然可行,则更新最小窗口大小。
4. 若窗口不再可行,则跳转至 2
 

代码实现如下:

class Solution(object):
    def minWindow(self, s, t):
        """
        :type s: str
        :type t: str
        :rtype: str
        """
        dict_t = collections.Counter(t) #对t中的字母计数
        required = len(dict_t) #获得dict_t的长度
        l, r = 0, 0 #初始化窗口
        formed = 0 #用来追踪在当前窗口中出现的t中的字母的个数(重复的字母只计数一次)
        window_counts = {} #
        ans = float("inf"), None, None
        while r < len(s):
            #从右边开始增加字母到窗口
            character = s[r]
            window_counts[character] = window_counts.get(character, 0) + 1
            #判断该字母是否满足题目要求
            if character in dict_t and window_counts[character] == dict_t[character]:
                formed += 1
            while l <= r and formed == required:
                character = s[l]
                #对当前最小的窗口大小进行保存
                if r - l + 1 < ans[0]:
                    ans = (r -l + 1, l , r)
                #窗口左指针右移
                window_counts[character] -= 1
                if character in dict_t and window_counts[character] < dict_t[character]:
                    formed -= 1
                l += 1
            r += 1
        return "" if ans[0] == float("inf") else s[ans[1] : ans[2] + 1]

提交结果:

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值