leetcode

76. 最小覆盖子串

2020-05-23  本文已影响0人  geaus

题目描述

给一个字符串S、一个字符串T。请在字符串S里面找出:包含T所有字符的最小子串。
示例:

输入: S = "ADOBECODEBANC", T = "ABC"
输出: "BANC"

说明:
如果 S 中不存这样的子串,则返回空字符串 ""。
如果 S 中存在这样的子串,我们保证它是唯一的答案。

解题思路:

使用左右指针滑动窗口的思想解决。
r指针用于延伸现有窗口,l指针用于收缩窗口。当窗口满足条件时,看能否收缩到最小窗口。
条件判断:用一个hash表表示t中所有字符以及个数。用另一个hash表表示当前窗口的字符和个数。

    unordered_map<char, int> ori, cnt;
    bool check(){
        for(const auto& p: ori){
            if(cnt.find(p.first)==cnt.end() || cnt[p.first]<p.second)
                return false;
        }
        return true;
    }

    string minWindow(string s, string t){
        for(auto c:t){
            ori[c]++;
        }

        int len = INT32_MAX, anL = -1;
        int l=0, r=-1;
        while(r<s.size()){
            if(ori.find(s[++r])!=ori.end())
                ++cnt[s[r]];

            while(l<=r && check()){
                if(r-l+1<len){
                    len = r-l+1;
                    anL = l;
                }

                if(ori.find(s[l])!=ori.end())
                    --cnt[s[l]];
                l++;
            }
        }

        return anL==-1 ? string("") : s.substr(l, len);
    }
上一篇 下一篇

猜你喜欢

热点阅读