[LeetCode]76. Minimum Window Substring

76. Minimum Window Substring

题目:计算最小区间的子字符串

滑动窗口

思路:纪录移动过程中的左边和右边窗口,并且维护最小的左边和右边窗口值,通过使用次数来判断是否要移动窗口,比如,当前ABC对应的剩余使用次数都为0,如果再次碰见A的时候,在减去1后发现它已经为-1,那么就会将左边窗口移动到大于等于0的位置,也就是B的位置,构成一个BCA的子串,以此类推。整体就是一个滑动窗口的原理。

import collections
class Solution(object):
    def minWindow(self, s, t):
        count, missing = collections.Counter(t), len(t)
        left = 0  # 移动窗口
        first, last = 0, 0  # 最终的窗口
        for right, c in enumerate(s, 1):
            # 统计剩下来的字符个数
            missing -= count[c] > 0
            count[c] -= 1
            # 表示子串包含了T中所有的字符
            if not missing:
                # 设置left的值小于0是因为一开始计算的时候使用过一次,它的结果已经变成了0
                # 移动左边的窗口,直到它对应的值不再小于0,也就是
                while left < right and count[s[left]] < 0:
                    count[s[left]] += 1
                    left += 1
                # 更新最小区间
                if not right or right - left <= last - first:
                    first, last = left, right
        return s[first:last]
posted @ 2017-08-26 01:54  banananana  阅读(123)  评论(0)    收藏  举报