Leetcode-76.最小覆盖子串

给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串。

示例:

输入: S = “ADOBECODEBANC”, T = “ABC”
输出: “BANC”
说明:

如果 S 中不存这样的子串,则返回空字符串 “”。
如果 S 中存在这样的子串,我们保证它是唯一的答案。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-window-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法1:滑动窗口

思路:

1.两个map,need存需要的字符个数量,window存当前窗口的各字符数量,

2.每次滑动右边界,判断该窗口是否符合子串要求,若符合要求,1是判断该字符是否在need中,若在是否数量==了need中的数量,若==将目标值match+1,当match==need.size表示该窗口符合子串要求

3.开始移动左边界,直到不符合要求,中间记录最小长度子串的起始位置及长度

4.最后返回空字符串或者找到的最小子串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class Solution {
public:
string minWindow(string s, string t) {
int start=0,minlen=INT_MAX,left=0,right=0;
unordered_map<char,int> window;
unordered_map<char,int> need;
for(char c:t) need[c]++;
int match=0;

while(right<s.size())
{
char c1=s[right];
if(need.count(c1))
{
window[c1]++;
if(window[c1]==need[c1])
{
match++;
}
}
right++;
while(match==need.size())
{
if(right-left<minlen)
{
start=left;
minlen=right-left;
}
char c2=s[left];
if(need.count(c2))
{
window[c2]--;
if(window[c2]<need[c2])
match--;
}
left++;
}
}
return minlen == INT_MAX ? "" : s.substr(start, minlen);
}
};