给你一个字符串 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); } };
|