题目
思路 滑动窗口
因为大写英文字母范围是65-90,小写英文字母范围是97-122,所以声明一个大小为123的数组。整体思想是先向右移动右指针找到s中包含t所有字符的子串,再向右移动左指针直到左指针指向的字符是需要且不多余的。首先遍历字符串t,对其中出现的字符在数组中++,表示需要这个字符,并用一个变量c=t.size()表示需要的总字符数。如果数组中对应的元素是负的,就表明这个元素数量多了。然后遍历字符串s,出现的字符在数组中--,并判断如果本来是需要的,就得把cnt--。如果cnt==0,就表明不需要了,再找到子串的开头(应为需要的字符),然后判断长度输出。
代码
class Solution {
public:
string minWindow(string s, string t) {
vector<int> v(123,0);
int cnt=t.size(),start=-1,len=INT_MAX;
for(char c:t)
v[c]++;
for(int l=0,r=0;r<s.size();r++){
char c=s[r];
if(v[c]-->0)
cnt--;
if(cnt==0){
while(v[s[l]]<0)
v[s[l++]]++;
if(len > r-l+1){
len = r-l+1;
start = l;
}
v[s[l++]]++;
cnt++;
}
}
return len == INT_MAX ? "" : s.substr(start,len);
}
};