O
问题
解决方案
代码
/*
思路: 这种字符串里面找子串问题采用滑动窗口, 套用滑动的模板
- define need ,window hashtable.
- add target into need
- define left ,right
- define start, end as record minest index;
- while right<size()
- - get s[right]
- - right++;
- - judge s[right] is in need and make it into window,
- - while right is enough,need is all down.using valid == need.size()
- - - get left vale and left++;
- - - if value in need , into another if and judge if need(left)size == window(left)size delete window , vlid == need.size()
*/
class Solution {
public:
string minWindow(string s, string t) {
unordered_map<char, int> need , window;
for(char c: t) need[c]++; // get every char number.
int left = 0, right = 0,valid= 0;
int start = 0 ,end = 0, len=s.size()+1 ;
while(right<s.size()){
char temp = s[right];
right++;
if(need.count(temp)){
window[temp]++;
if(window[temp]==need[temp]) //it mean the number of char is ok
valid++; // one char is over.
}
while(valid==need.size()){
char a = s[left];
if(right-left<len){
start = left;
end = right;
len = right -left;
}
left++;
if(need.count(a)){
if(need[a]==window[a])
valid--;
window[a]--;
}
}
}
return end ==0? "": s.substr(start,end-start);
}
};
总结与反思
- 第一次做这种题目,滑动窗口问题是真的难。子字符串的个数要匹配才算找到最左侧边界。
- hashtable真的很有用。 很多问题都可以用hashtable 去解决。