leetCode_Minimum Window Substring

来源:互联网 发布:mac 查找文件路径 编辑:程序博客网 时间:2024/06/08 12:35

题意:给定字符串s和t,返回s中包含t所有字符的长度最短的子串

例子:如s="ADOBECODEBANC",t="ABC",返回"BANC";

解法:用letters记录t中每个字符的出现个数,用一个队列记录s中的那些在t出现的下标,用cur记录s中t字符串里的字符出现个数,用count表示满足了t中的多少个字符。也就是说,若s[i]在t出现,并且cur[s[i]]<letters[s[i]]表示有效,count++。如果count与t的长度相等,表示全部字符已经出现一遍,下面只要从queue的下一个元素开始往复。说的很乱,看代码吧。

string minWindow(string s, string t){    int i,j,k,count=0,start,end;    vector<int> letters(128,0);    vector<int> cur(128,0);    queue<int> index;    start=-1;    end=s.length()+1;    for(i=0; i<t.length(); i++) letters[t[i]]++;    for(i=0; i<s.length(); i++)    {        if(letters[s[i]]>0)        {            index.push(i);            cur[s[i]]++;            if(cur[s[i]]<=letters[s[i]])            {                count++;                while(count==t.length())                {                    if(i-index.front()<end-start)                    {                        end=i;                        start=index.front();                    }                    cur[s[index.front()]]--;                    if(cur[s[index.front()]]<letters[s[index.front()]]) count--;                    index.pop();                }            }        }    }    if(start==-1) return "";    return s.substr(start,end-start+1);;}


0 0