解题思路
- 本题首先用
map
这一数据结构存储string t
中各个字符的统计个数 - 设置滑动窗口
left
和right
,在找到第一个满足条件的窗口之前,left
不移动,向右移动right
(直到right
遍历完主串s
) - 找到第一个满足条件的子串(记录初始位置和长度),此时
map
中各个字符的值为0 - 向右移动left,移动过程中注意:移动丢失的字符在
map
中记录(增加字符对应的int值),并将当前子串长度递减:if(++map_t[s[left]] > 0) cnt--;
判断是否大于零的原因是有可能存在主串中的字符不在t中,这种情况直接右移即可。
代码
class Solution {
public:
string minWindow(string s, string t)
{
unordered_map<char, int> map_t;
for(auto c :t) map_t[c]++;
int left = 0;
int right = 0;
int min_win = INT_MAX;
int cnt = 0;
int s_begin = 0;
for(right = 0; right < s.size(); right++)
{
if(--map_t[s[right]] >= 0) cnt++;
while(cnt == t.size())
{
if(right - left + 1 < min_win)
{
s_begin = left;
min_win = right - left + 1;
}
if(++map_t[s[left]] > 0) cnt--;
left++;
}
}
return min_win > s.size() ? "" : s.substr(s_begin, min_win);
}
};