LeetCode Minimum Window Substring

LeetCode解题之Minimum Window Substring


原题

给定两个字符串S和T,要求在O(n)的时间内找到包含T中所有字符的S的最短子字符串。

注意点:

  • 如果不存在满足要求的子字符串,则返回”“
  • 如果存在多个子字符串满足要求,可以保证其中只有一个最短的

例子:

输入: s = “ADOBECODEBANC”, t = “ABC”

输出: “BANC”

解题思路

通过前后指针来确定当前的子字符串,先不断移动后指针,直到子字符串中已经包含了所有T中的字符,尝试把前指针后移,并不断刷新最短长度和对应的起始位置,如果移动前指针后不再包含所有T中的字符,则继续移动后指针。交替移动前后指针,直到遍历完整个字符串S。

AC源码

from collections import defaultdict


class Solution(object):
    def minWindow(self, s, t):
        """
        :type s: str
        :type t: str
        :rtype: str
        """
        MAX_INT = 2147483647
        start = end = 0
        char_need = defaultdict(int)    # the count of char needed by current window, negative means current window has it but not needs it
        count_need = len(t)             # count of chars not in current window but in t
        min_length = MAX_INT
        min_start = 0
        for i in t:
            # current window needs all char in t
            char_need[i] += 1           
        while end < len(s):
            if char_need[s[end]] > 0:
                count_need -= 1
            # current window contains s[end] now, so does not need it any more
            char_need[s[end]] -= 1      
            end += 1
            while count_need == 0:
                if min_length > end - start:
                    min_length = end - start
                    min_start = start
                # current window does not contain s[start] any more
                char_need[s[start]] += 1    
                # when some count in char_need is positive, it means there is char in t but not current window
                if char_need[s[start]] > 0: 
                    count_need += 1
                start += 1
        return "" if min_length == MAX_INT else s[min_start:min_start + min_length]


if __name__ == "__main__":
    assert Solution().minWindow("ADOBECODEBANC", "ABC") == "BANC"

欢迎查看我的Github (https://github.com/gavinfish/LeetCode-Python) 来获得相关源码。

你可能感兴趣的:(LeetCode,LeetCode,Python)