📅  最后修改于: 2023-12-03 15:22:47.576000             🧑  作者: Mango
包含字符串本身所有字符的最小窗口,是指在一个字符串中,找出包含另一个字符串中所有字符的最短子字符串。
给定字符串 s
和字符串 t
,请在 s
中找出包含 t
所有字符的最小子串。
示例:
输入:s = "ADOBECODEBANC", t = "ABC"
输出:"BANC"
注意:
s
中不存在涵盖 t
所有字符的子串,则返回空字符串 ""
。t
所有字符的子串,返回任意一个即可。思路:滑动窗口
时间复杂度:$O(n)$
空间复杂度:$O(n)$
算法实现:
class Solution {
public:
string minWindow(string s, string t) {
if(s.empty() || s.size() < t.size())
return "";
vector<int> hash(128, 0);
for(int i = 0; i < t.size(); i++)
{
hash[t[i]]++;
}
int left = 0, right = 0, count = t.size(), minl = s.size() + 1, start = 0;
while(right < s.size())
{
if(hash[s[right]] > 0)
{
count--;
}
hash[s[right]]--;
right++;
while(count == 0)
{
if(right - left < minl)
{
start = left;
minl = right - left;
}
if(hash[s[left]] == 0)
{
count++;
}
hash[s[left]]++;
left++;
}
}
if(minl > s.size())
return "";
return s.substr(start, minl);
}
};
其中,用到了滑动窗口算法,即:
t
中字符出现的次数的哈希表;count
值;count
值为 $0$ 时,移动左指针,计算子字符串长度,更新最小子字符串长度。除此之外,我们还需要注意一些细节问题,比如:
s
中不存在涵盖 t
所有字符的子串,则返回空字符串 ""
;t
所有字符的子串,返回任意一个即可。本题是一道非常经典的字符串问题,考察了算法的基本功,也考察了你对细节的处理能力。掌握该问题的解决办法,实际上也是一种非常好的思考方式和编程技巧,有很高的参考价值。