今天是刷题的第六天,前几天因为在打美赛所以没有刷题,现在继续刷题。
76. Minimum Window Substring(hard)
题目描述
- 这道题的题意是给定两个字符串S 和T,求S 中包含T 所有字符的最短连续子字符串的长度,同时要求时间复杂度不得超过O(n)。
- 输入是两个字符串S 和T,输出是一个S 字符串的子串。
策略
- 本题使用滑动窗口求解,即两个指针l 和r 都是从最左端向最右端移动,且l 的位置一定在r 的左边或重合。注意本题虽然在for 循环里出现了一个while 循环,但是因为while 循环负责移动l指针,且l 只会从左到右移动一次,因此总时间复杂度仍然是O(n)。本题使用了长度为128的数组来映射字符,也可以用哈希表替代;其中chars 表示目前每个字符缺少的数量,flag 表示每个字符是否在T 中存在。
代码:
class Solution {
public:
string minWindow(string s, string t) {
vector<int> chars(128,0);
vector<bool> flag(128,false);
for(int i=0; i<t.size(); i++){
chars[t[i]] ++;
flag[t[i]] = true;
}
int cnt=0, l=0, min_l=0, min_size=s.size()+1;
for(int i=0;i<s.size();i++){
if(flag[s[i]]){
if(--chars[s[i]] >= 0){
cnt++;
}
while(cnt == t.size()){
if(i-l+1 < min_size){
min_l = l;
min_size = i-l+1;
}
if(flag[s[l]] && ++chars[s[l]]>0){
--cnt;
}
++l;
}
}
}
return min_size>s.size() ? "":s.substr(min_l, min_size);
}
};