边工作边刷题:70天一遍leetcode: day 22

Minimum Window Substring

要点:同一思路的还有Substring with Concatenation of All Words, Longest Substring with At Most K Distinct Characters。基本要素是found map来记录当前sliding window中已经有的个数,用pattern map来记录满足pattern需要的个数。另外一个count变量就能知道是否当前sliding window和pattern匹配。
Substring with Concatenation of All Words这题sliding window是固定的,所以found中某元素只要个数超过了就要移动左边界来重新match。而本题超过了found个数也+1,但count保持不变。这样,每次重新移动调整左边界的内循环里也是去除无关或者超过的元素,从而保持sliding window中永远是match的,而是否sliding window中有超过pattern的字符是无所谓的。
错误点:

  • pattern和found别搞混,这里很容易typo
  • 因为只有match的情况才更新minLen,所以对不match要特殊处理
class Solution(object):
    def minWindow(self, s, t):
        """
        :type s: str
        :type t: str
        :rtype: str
        """
        ns = len(s)
        nt = len(t)
        pattern = {}
        found = {}
        for tc in t:
            if tc not in pattern:
                pattern[tc]=0
            pattern[tc]+=1
        
        count = 0
        start = 0
        minLen = sys.maxint
        minStart = -1
        for i in range(len(s)):
            if s[i] not in pattern:
                continue
            
            if s[i] not in found:
                found[s[i]]=0
            found[s[i]]+=1
            if found[s[i]]<=pattern[s[i]]:
                count+=1
            
            #print found,pattern
            if count==nt:
                while start<ns:
                    if s[start] not in pattern:
                        start+=1
                    elif pattern[s[start]]<found[s[start]]:
                        found[s[start]]-=1
                        start+=1
                    else:
                        break

                if i-start+1<minLen:
                    minLen = i-start+1
                    minStart = start
        if minStart==-1: return ""
        #print minStart
        return s[minStart:minStart+minLen]
            
            
posted @ 2016-04-27 10:14  absolute100  阅读(66)  评论(0编辑  收藏  举报