【LeetCode】76. Minimum Window Substring 解题报告(Python)

127 篇文章 2 订阅
102 篇文章 2 订阅

题目分析:

这一题是给我们S和T两个串,让我们找在 S 中找出包含 T 所有字母的最小子串。解决这种题目的方法叫滑动窗口,很多子串,子数组,子序列等等的问题都是依靠这个方法解决的。

解题思路:

  1. 首先要知道T中所包含的字母元素及其个数(dict,字典解决)
  2. 使用左右指针再S中找到一个包含T中所有元素的字串
  3. 使用左指针缩小范围,更新min_len
  4. 移动左指针时如果该元素存在就加回来map[s[left]] += 1,如果加后值大于0了说明字串缺少元素了把长度减一if map[s[left]] > 0: count -= 1,开始移动右指针。
  5. 参考博客说的更清楚

测试代码:(Runtime: 96 ms, faster than 92.99 % )

class Solution:
    def minWindow(self, s, t):
        res , map = '', {}
        left, count, min_len = 0, 0, len(s) + 1
        for c in t:
            map[c] = map.get(c, 0) + 1
        for i in range(len(s)):
            if s[i] in map:
                map[s[i]] -= 1
                if map[s[i]] >= 0:
                    count += 1
                while count == len(t):
                    if min_len > i - left + 1:
                        min_len = i - left + 1
                        res = s[left: i + 1]
                    if s[left] in map:
                        map[s[left]] += 1
                        if map[s[left]] > 0:
                            count -= 1
                    left += 1
        return res
       
print(Solution().minWindow("ADOBECODEBANC", "ABC")) #提交时请删除该行

参考博客

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值