lc 76. Minimum Window Substring

https://leetcode.com/problems/minimum-window-substring/

滑动窗口

1.如果要求只要出现就算,也就是所t='a'和t='aa'是一样的话,那么记录一个出现过的字符的dict,只要这个set和目标set一样大,就可以去记录一下结果。这个结果可能是窗口右边移动产生,也可能是窗口左边移动产生的。

然后右界负责产生合法的,左界负责使之不合法。

2.如果是不光要出现,还要满足数量要求的话,就都要用dict了。一旦一次右边的移动导致d[c]==s[c]就是卡到了上界,那么nums+=1,就是记录几个字符满足了数量要求。

一旦一次左边的移动导致d[c]==s[c]-1那么nums-=1。每次我们用nums==len(s)来判断是否是一个合法窗。

trick:

要两层while嵌套,不要用并列的while:

while 不合法:

  j+=1 并且更新状态

 while 合法:

    记录一下

    i+=1 并且更新状态

 

代码:

class Solution:
    def minWindow(self, s, t):
        """
        :type s: str
        :type t: str
        :rtype: str
        """
        ss={}
        d={}
        for c in t:
            d[c]=0
            if c in ss:
                ss[c]+=1
            else:
                ss[c]=1
        t=ss
        nums=0

        ans=[]
        i,j=0,-1
        while nums<len(t) and j+1<len(s): # not satisfy
            j+=1
            c=s[j]
            if c in t:
                d[c]+=1
                if d[c]==t[c]:
                    nums+=1
            while nums>=len(t) and i<len(s):
                if len(ans) == 0 or ans[1] - ans[0] > j - i:
                    ans = [i, j]
                c=s[i]
                if c in t:
                    if d[c]==t[c]:
                        nums-=1
                    d[c]-=1
                i+=1
        if len(ans)==0:
            return ''
        return s[ans[0]:ans[1]+1]

 里面的nums是有几个字符满足了数量要求,其实不这样也行,我们记录的是满足需求的字符的数量和,就是a出现两次也算,就是维持一个总数。

posted @ 2019-01-10 15:20  Cloud.9  阅读(205)  评论(0编辑  收藏  举报