首页 > 代码库 > LeetCode OJ--Minimum Window Substring ***

LeetCode OJ--Minimum Window Substring ***

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

模拟题

这道题细节比较多。从左到右扫一遍模拟着做

 class Solution {public:    string minWindow(string S, string T) {        string ans = "";        if(S.size() < T.size() )            return ans;                unordered_map<char,int> count;        unordered_set<char> charInT;        unordered_map<char,int> countT;                for(int i = 0; i < T.size(); i++)        {            charInT.insert(T[i]);            countT[T[i]]++;        }                int ansI = 0, ansJ = 0;        // 先找第一个合法的        for(int i = 0; i < S.size(); i++)        {            if(charInT.find(S[i]) != charInT.end())            {                count[S[i]]++;                // 如果都找到了                if(count.size() == countT.size())                {                    bool flag = true;                    for(unordered_map<char,int>::iterator itr = countT.begin(); itr != countT.end(); itr++)                    {                        if(itr->second > count[itr->first])                            flag = false; // 还没都匹配                    }                    if(flag)                    {                        ansJ = i;                        ans = S.substr(ansI,ansJ+1);                        break;                    }                }            }        }        // 往后遍历        for(int m = 0; m < S.size(); m++)        {            if(charInT.find(S[m]) == charInT.end())                ansI++; // 往前走1个是安全的            else             {                count[S[m]]--;                if(count[S[m]] >= countT[S[m]])                    ansI++;                else                {                    if(ans.size() > ansJ - m + 1)                        ans = S.substr(m,ansJ - m +1);                    // find new end                    int temp = ansJ;                    temp++;                    while(temp<S.size() && S[temp] != S[m])                    {                        if(charInT.find(S[temp]) != charInT.end())                            count[S[temp]]++; // 记录新加进来了合法的                        temp++;                    }                    if(temp == S.size()) // 到了最后也没找到                    {                        return ans;                    }                    else                    {                        ansJ = temp;                        count[S[temp]]++;                    }                }            }        }    }};