Leetcode76. Minimum Window Substring

来源:互联网 发布:海森伯格矩阵 编辑:程序博客网 时间:2024/06/05 06:38

76. Minimum Window Substring

给定一个主串s和匹配串t,要求主串中字串包含t串所有字符,求这样的最小长度字串。

例如

S = "ADOBECODEBANC"

T = "ABC"

则最小字串为“BANC”。

1 这里引入HASH机制,即定义一个map<char,int> a,记录t中每个字符出现的次数这里设置一个计数器cnt表示s字串内出现与t中字符相同的有效字符额个数,即不考虑重覆;

2 引入首尾两个指针i和l,之间就是包含字符串t中所有字符的子串,i指针对s进行遍历,当出现和t中相同字符时,次数减1;头指针l进行区间收缩,当出现和t中相同字符时,次数加1,之所以加1是这些字符将不在最终所选字串内,并自增1

3 t中所有字符串出现的次数等于0(s字串出现次数和t出现次数相同)或者小于0(s字串出现次数大于t出现次数)说明已经包含t中所有元素cnt=t.size()

4 cnt计数原则,当i指针对s进行遍历,当出现和t中相同字符时,次数减1,若此时该字符对应次数大于等于0,则cnt++,否则说明以前已经计数过;同理,头指针l进行区间收缩,当出现和t中相同字符时,次数加1后,要求该字符出现此时大于0才能cnt--,否则说明存在多个这样的字符,

string minWindow(string s,string t){string res="";int slen=s.size();int tlen=t.size();if(slen<1||tlen<1||slen<tlen)return res;map<char,int> a;for(int i=0;i<tlen;i++)    a[t[i]]++;int minisize=slen+1;int cnt=0;int l=0;int minl=0;for(int i=0;i<slen;i++){if(a.find(s[i])!=a.end()){    if(--a[s[i]]>=0)cnt++;    while(cnt==tlen){if(i-l+1<minisize){minl=l;minisize=i-l+1;}if(a.find(s[l])!=a.end()){if(++a[s[l]]>0)--cnt;}l++;                     }                          }}if(minisize>slen)return "";return s.substr(minl,minisize);}
例子:

S = "ADOBECODEBANC"

T = "ABC"

运行分析


0 0
原创粉丝点击