1 题目
2 思路
使用win存储窗口里每个字母的数量
使用tt存储字符串t每个字母的数量
每次窗口加一个字母进入的时候,就check是否满足窗口内覆盖字串t,满足就缩小窗口,不然就继续扩大窗口。
3 AC代码
map<char,int> win;
map<char,int> tt;
bool check(){
map<char,int>::iterator it=tt.begin();
for(;it!=tt.end();it++){
if(it->second<=win[it->first])//相等
continue;
else
return false;//不满足覆盖要求
}
return true;//
}
void init() {
map<char,int>::iterator it=win.begin();
for(; it!=win.end(); it++) {
it->second=0;
}
for(it=tt.begin(); it!=tt.end(); it++) {
it->second=0;
}
}
class Solution {
public:
string minWindow(string s, string t) {
init();//初始化 不知道为什么leecode的全局变量并不会为空
for(int i=0;i<t.length()-1;i++)
win[s[i]]++;//滑动窗口
for(int i=0;i<t.length();i++)
tt[t[i]]++;
int j=0,pos=0,min_len=99999;
for(int i=t.length()-1;i<s.length();i++){
win[s[i]]++;
while(check()){
if(min_len>i-j+1){
pos=j;//记录位置
min_len=i-j+1;
}
win[s[j]]--;
j++;
}
}
string ans="";
if(min_len==99999)
return ans;
for(int i=pos;i<pos+min_len;i++)
ans+=s[i];
return ans;
}
};