题目描述:
题解:需要遍历所有可能的字串进行求解,采用滑动窗口的方法进行处理。
滑动窗口常规步骤:
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; }