- O(n * m) solution is ordinary
- O(N)的想法就没有思路了。。
看了别人的思路,wa了4,5次才过
class Solution {
public:
bool check(const vector<int>& cnts, const vector<int>&cntt){
for(int i = 0; i < 55; ++i){
if(cnts[i] < cntt[i]){
return false;
}
}
return true;
}
int getIdx(char t){
if(t >= 'a' && t <= 'z'){
return t - 'a' + 27;
}
return t - 'A';
}
string minWindow(string S, string T) {
int slen = S.length(), tlen = T.length();
if(tlen > slen){
return "";
}
vector<int> cnts,cntt;
cnts.resize(55, 0);
cntt.resize(55, 0);
for(int i = 0; i < tlen; ++i){
cntt[getIdx(T[i])]++;
}
int tmpmin = 0x7fffffff, mmin = 0x7fffffff;
int fast = 0, slow = 0;
int recf = 0, recb = 1;
bool find = false;
while(fast < slen){
cnts[getIdx(S[fast])]++;
if(check(cnts, cntt)){
find = true;
tmpmin = fast - slow + 1;
if(tmpmin < mmin){
mmin = tmpmin;
recb = fast;
recf = slow;
}
while(slow <= fast){
cnts[getIdx(S[slow])]--;
slow++;
if(check(cnts, cntt)){
find = true;
tmpmin = fast - slow + 1;
if(tmpmin < mmin){
mmin = tmpmin;
recb = fast;
recf = slow;
}
}
else{
break;
}
}
}
fast++;
}
if(!find){
return "";
}
return S.substr(recf, recb - recf + 1);
}
};