Leetcode 76 最小覆盖字串 (滑动窗口)

题目描述:

 

 题解:需要遍历所有可能的字串进行求解,采用滑动窗口的方法进行处理。

滑动窗口常规步骤:

1 .初始,left指针和right指针都指向S的第一个元素.

2. 将 right指针右移,扩张窗口,直到得到一个可行窗口,亦即包含T的全部字母的窗口。

3. 得到可行的窗口后,将left指针逐个右移,若得到的窗口依然可行,则更新最小窗口大小。

4. 若窗口不再可行,则跳转至 2。

 

本题用一个hash数组flag记录t中每个元素出现的次数。给定一个窗口(l,r)。

在向右滑动的过程中,对于right指向的元素tmp,如果flag[tmp-'A'] >0.count++,随之flag[tmp-'A']++;

在收缩的过程中,对于left指向的元素tmp,flag[tmp-'A']++,当flag[tmp-'A']>0的时候,count--;

重复上述过程即可;

 

AC代码:

   int flag_t[270];
    string minWindow(string s, string t) {
        int Lent = t.length();
        int Lens = s.length();
        int r = 0;
        int l = 0;
        int mn = INT_MAX;
        string ans = "";
        int count = 0;
        
        memset(flag_t,0,sizeof(flag_t));
        for(int i=0;i<Lent;i++) flag_t[t[i]-'A']++;
        while(r < Lens)
        {
            while(count != Lent && r<Lens)
            {
                if(flag_t[s[r]-'A'] > 0) count++;
                flag_t[s[r]-'A'] --;
                r++;
            }
           
            if(r >= Lens && count !=Lent ) return ans;
            while(count == Lent && l<=r)
            {
                flag_t[s[l]-'A']++;
                if(flag_t[s[l]-'A'] > 0) count--;
                l++;
            }
            
            int tmp_len = max(r-1,l-1)-min(r-1,l-1)+1;
            if(mn > tmp_len) 
            {
                mn = tmp_len;
                ans = s.substr(l-1,tmp_len);
            }
        }
        return ans;
    }

 

posted @ 2020-02-06 16:35  猪突猛进!!!  阅读(174)  评论(0编辑  收藏  举报