问题
https://leetcode.com/problems/minimum-window-substring/
解法
滑动窗口,
首先记录每个字符在t中出现的次数。
在s中移动窗口的右侧, 每次进入窗口的字符,其计数器减1, 如果该字符在t中出现,则总的计数器减一, 如果总的计数器为0 则表示窗口内的字符包含t,此时再将窗口的左侧前移, 每移一位, 对应字符的计数器加1, 如果计数器大于1, 则说明此字符在t中出现, 总计数器加1,表示确实一个字符。
记录总的计数器为0时, 最小窗口长度, 则为答案。
注意, 对于t中包含字符, 其计数器初始值为正数, t不包含的字符, 其计数器初始值为0, 因此在窗口滑动时, t不包含的字符, 计数器永远小于等于0,而t中包含的字符, 当窗口中此字符数目大于等于t中出现次数时, 计数器为小于0, 当出现次数不足时, 计数器大于0;
class Solution {
public:
string minWindow(string s, string t) {
if (t.empty())
return "";
int minBegin;
int minLen = INT_MAX;
int wStart = 0;
vector<int> hash_table(128, 0);
for (auto c:t)
++hash_table[c];
int count = t.size();
for (int wEnd =0; wEnd < s.size(); ++wEnd)
{
if(hash_table[s[wEnd]] > 0)
--count;
--hash_table[s[wEnd]];
while (count == 0)
{
if (wEnd - wStart+1 < minLen)
{
minBegin = wStart;
minLen = wEnd - wStart+1;
}
++hash_table[s[wStart]];
if (hash_table[s[wStart]] > 0)
++count;
++wStart;
}
}
if (minLen == INT_MAX)
return "";
return s.substr(minBegin, minLen);
}
};