您的位置:首页 > 编程语言 > Python开发

LeetCode 76 Minimum Window Substring(Python详解及实现)

2017-08-08 11:27 651 查看
【题目】

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

 

For example,

S = "ADOBECODEBANC"

T = "ABC"

Minimum window is "BANC".

 

Note:

If there is no such window in S that coversall characters in T, return the empty string "".

 

If there are multiple such windows, you areguaranteed that there will always be only one unique minimum window in S.

 

给两个字符串S和T,在S中找到最短的子串,使得子串中包含T中所有的字符,要求时间复杂度为O(n)。

 

如:输入S = "ADOBECODEBANC"    T = "ABC"

输出 "BANC",找不到则输出""。

 

【思路】

l  首先用字典记录T中每个字符出现的次数;

l  定义两个指针PHead,pTail来指示当前窗口的位置,并判断该窗口中是否出现了T中所有字符;

l  若当前窗口未包含,尾指针不断往后扫,直至扫到有一个窗口包含了所有T的字符,并且确保,当前子串中不含更短子串,最后记录下此时的窗口长度,和子串;

l  尾指针继续后扫,当遇到T中字符时候,看是否可以收缩头指针,若能则比较和前一个窗口长度比较,若当前的长度短,则更新。直至移到尾部,返回结果。

 

【Python实现】

# -*- coding: utf-8 -*-

"""

Created on Tue Aug  8 09:56:38 2017

 

@author: Administrator

"""

 

class Solution:

   def minWindow(self, s, t):

       """

       :type s: str

       :type t: str

       :rtype: str

       """

       s_len = len(s)

       t_len = len(t)

       if s_len == 0 or t_len == 0 or t_len > s_len:

           return ""

           

       countT1 = {}

       countT2 = {}

       for char in t:#记录T中所有字符及其出现次数

           if char not in countT1:

                countT1[char] = 1#当前字符char不在字典中,则char作为key加入字典count1,value为次数置为1

                countT2[char] = 1#count2与count1完全相同

           else:

                countT1[char] += 1#当前字符char已在在字典中,出现次数+1

                countT2[char] += 1    

       #count = t_len

       minSize = s_len + 1

       

       pHead = 0

       minStart = 0

 

       for pTail in range(len(s)):

           if s[pTail] in countT2 and countT2[s[pTail]] > 0:#在count2找到字符s[pTail],且次数大于0,说明有找到子串的可能

                countT1[s[pTail]] -= 1#在count1中将当前字符出现次数减去1

                if countT1[s[pTail]] >= 0:#判断count1中当前字符次数是否大于或等于0

                    t_len -= 1#在S中已找到一个字符,t_len-1

                if t_len == 0:#在s中找到了T中所有字符

                    while True:#寻找最短的字符串

                        if s[pHead] in countT2and countT2[s[pHead]] > 0:

                            ifcountT1[s[pHead]] < 0:#判断是否找到了T中首个字符需要的个数,个数大于T中个数才会对头指针后移

                               countT1[s[pHead]] += 1#后一个证明T[0]个数又回到后移前的个数,对个数加1

                            else:

                                break

                        pHead += 1#头指针后移一位,继续判断可能的最短子串

                    if minSize > pTail -pHead + 1:#若当前长度短则更新子串头尾指针

                        minSize = pTail - pHead+ 1

                        minStart = pHead

                       print(s[minStart:minStart + minSize])

                        print(minSize)

       if minSize < len(s) + 1:

           print(s[minStart:minStart + minSize])

           return s[minStart:minStart + minSize]

       else:

           return ""   

       

if __name__ == '__main__':

    S= Solution()

    s= "ADOBECODEBANC"

    t= "ABC"

   S.minWindow(s, t)

       

 

                   

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  LeetCode Python string