class Solution {
public:
string minWindow(string s, string t) {
if (t.size() > s.size()) {
return "";
}
unordered_map<char, int> unorder_map;
unordered_map<char, int> compare_unorder_map;
map<int, char> map_compare;
for (auto iter : t)
{
unorder_map[iter]++;
}
for (size_t i = 0; i < s.size(); i++)
{
map_compare[i] = s[i];
}
// 根据数量判断
// 有滑动的最小值 就是t的长度
// 如何判断当前的是否有t的数量字符呢?
int left = 0;
string ss;
int count = 0;
// 使用count 判断相等
for (int right = 0; right < s.size(); right++)
{
// 如果当前没有该字符 有效字符
// 没有初始值的默认为0
if (++compare_unorder_map[s[right]] <= unorder_map[s[right]]) {
// 添加当前字符
count++;
// 添加到这的都是有效值
}
// 去重 重复的元素。 该元素多余肯定删除
// 要么该元素不是目标元素,要么该元素多余
// 右窗口等待, 左窗口移动
while (compare_unorder_map[s[left]] > unorder_map[s[left]])
{
compare_unorder_map[s[left]]--;
left++;
}
// 如何判断相等?
if (count == t.size()) {
if (ss.empty() || ss.length() > right - left + 1) {
ss = s.substr(left, right - left + 1);
}
}
}
return ss;
}
};
1:找出哈希表从而判断是否相等
2:左窗口滑动的一些细节。