解题思路:
- 题目要求寻找覆盖目标t的最小字串,这个题是给定长度字符串和覆盖字符串,可以采用双指针的滑动窗口来计算
- 注意事项:
1.注意while循环截至条件
2.何时对是否符合要求进行判断
3.更新最小字串策略
4.更新左右指针位置
5.注意window[c]++和window[c]–与if判断的位置
class Solution {
public:
string minWindow(string s, string t) {
//选用hashmap来存储,方便记录窗口和覆盖的每一个字符的个数,达到精准记录的目的
unordered_map<char,int>need,window;
for(char c : t){
need[c]++;
}
//滑动窗口双指针初始化位置
int left = 0,right = 0;
//记录窗口中符合t的个数,当valid == t.size()的时候代表此时窗口内的元素已经满足要求,可以进行左指针收缩
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(need[c]==window[c]){
valid++;
}
}
while(valid==need.size()){
//更新最小覆盖字串
if(right - left < len){
// 记录更小的字串位置和长度
start = left;
len = right - left;
}
char rc = s[left];
left++;
//判断是否为需要的字符
if(need.count(rc)){
//判断数量是否符合需要的数量
if(need[rc]==window[rc]){
valid--;
}
//特别注意这里先减再判断
window[rc]--;
}
}
}
return len == INT_MAX?"":s.substr(start,len);
}
};