题目描述
给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。
注意:如果 s 中存在这样的子串,我们保证它是唯一的答案。
示例 1:
输入:s = “ADOBECODEBANC”, t = “ABC”
输出:“BANC”
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-window-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
C++
class Solution {
public:
/*思路:
滑动窗口+哈希表
*/
string minWindow(string s, string t) {
//特殊情况
if(t.size()>s.size()) return "";
if(t.size()==0) return "";
unordered_map<char,int> need; //记录t的字符频率
unordered_map<char,int> Window; //滑动窗口中要找字符的频率
for(char c:t) need[c]++;
int left=0,right=0;
int valid=0; //记录已经找到的字符的个数
int start=0,len=INT_MAX;
while(right<s.size()){
char c=s[right] ; //要加入窗口的字符
right++; //窗口扩增
//更新数据
if(need.count(c)){
Window[c]++;
if(Window[c]==need[c]) {
valid++;
}
}
//判断是否找到解了
while(valid==need.size()){
if (right - left < len) {
start = left;
len = right - left;
}
char d=s[left]; //要从窗口删除的字符
left++;
//判断是否可以优化,即窗口缩小
if(need.count(d)){
if(Window[d]==need[d]){
valid--; //如果真减掉了,下次直接跳出循环了
}
Window[d]-- ;
}
}
}
return len == INT_MAX ?
"" : s.substr(start, len);
}
};

被折叠的 条评论
为什么被折叠?



