LeetCode76.Minimum Window Substring

题目:

Given a string S and a string T, find the minimum window in S which will contain all the characters in T in complexity O(n).

Example:

Input: S = "ADOBECODEBANC", T = "ABC"
Output: "BANC"

Note:

  • If there is no such window in S that covers all characters in T, return the empty string "".
  • If there is such window, you are guaranteed that there will always be only one unique minimum window in S.

思路:

题目要求的时间复杂度为O(n),意味着选定窗口大小,依次遍历字符串的暴力方法(时间复杂度为O(n^2))不合适。

联想到“有序数组和中为S的两个数”问题的解法,可以尝试用指针移动的方式来遍历字符串,以达到O(n)的时间复杂度。

基本的思路是右指针从左向右遍历S,对每一个右指针问题,求可能的最短窗口(用左指针从左向右的遍历实现)。为了判断窗口的合法性,需要一个字典,存储目标字符串T中的元素在窗口中是否出现。

python的具体实现代码如下:

 1 class Solution(object):
 2     def minWindow(self, s, t):
 3         if not s or not t:
 4             return ""
 5         need = {}
 6         for char in t:
 7             if char not in need:
 8                 need[char] = 1
 9             else:
10                 need[char] += 1
11         missing = len(t)
12         min_left = 0
13         min_len = len(s) + 1
14         left = 0
15         for right, char in enumerate(s):
16             if char in need:
17                 need[char] -= 1
18                 if need[char] >= 0:
19                     missing -= 1
20                 while missing == 0:
21                     if right - left + 1 < min_len:
22                         min_left, min_len = left, (right - left + 1)
23                     if s[left] in need:
24                         need[s[left]] += 1
25                         if need[s[left]] > 0:
26                             missing += 1
27                     left += 1
28         if min_len > len(s):
29             return ""
30         return s[min_left: min_left + min_len]

在leetcode上显示运行时间快过99%的提交方案

 

posted @ 2018-06-03 10:42  板弓子  阅读(112)  评论(0编辑  收藏  举报