leetcode 76. 最小覆盖子串
问题描述
给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串。
示例:
输入: S = "ADOBECODEBANC", T = "ABC"
输出: "BANC"
说明:
如果 S 中不存这样的子串,则返回空字符串 ""。
如果 S 中存在这样的子串,我们保证它是唯一的答案。
代码(双指针)
class Solution {
public:
string minWindow(string s, string t) {
int left = 0,right = 0,match=0,len=INT_MAX,start;
int lens = s.size(),lent = t.size();
string ans;
if(lens < lent)return ans;
unordered_map<char,int> nums,numt;
for(int i = 0; i < lent; ++i)++numt[t[i]];
//for(char c:t)++numt[c];//速度慢
for(right = 0; right < lens; ++right)
{
//如果匹配上
char c = s[right];
if(numt.find(c) != numt.end())
{
++nums[c];
if(nums[c] == numt[c])
{
++match;
}
while(match == numt.size())
{
if(len > right - left +1)
{
len = right - left +1;
start = left;
}
char b = s[left];
if(numt.find(b)!=numt.end())
{
--nums[b];
if(nums[b] < numt[b])--match;
}
++left;
}
}
}
return len==INT_MAX?"":s.substr(start,len);
}
};
结果:
执行用时 :36 ms, 在所有 C++ 提交中击败了56.57%的用户
内存消耗 :10.1 MB, 在所有 C++ 提交中击败了62.41%的用户