给定一个字符串 S 和一个字符串 T,请在 S 中找出包含 T 所有字母的最小子串。
示例:
输入: S = “ADOBECODEBANC”, T = “ABC” 输出: “BANC”
滑动窗口计算数组的长度
class Solution { public: string minWindow(string s, string t) { int tFreq[256] = {0}; for(int i = 0 ; i < t.size() ; i ++) tFreq[t[i]] ++; int sFreq[256] = {0}; int sCnt = 0; int minLength = s.size() + 1; int startIndex = -1; int l = 0, r = -1; while(l < s.size()){ if(r + 1 < s.size() && sCnt < t.size()){ sFreq[s[r+1]] ++; if(sFreq[s[r+1]] <= tFreq[s[r+1]]) sCnt ++; r ++; } else{ assert(sCnt <= t.size()); if(sCnt == t.size() && r - l + 1 < minLength){ minLength = r - l + 1; startIndex = l; } sFreq[s[l]] --; if(sFreq[s[l]] < tFreq[s[l]]) sCnt --; l ++; } } if( startIndex != -1 ) return s.substr(startIndex, minLength); return ""; } };