思路:用两个“指针”,后面的指针找合法的窗口,前面的指针来缩小窗口到最小,找出最小的那个即为答案。
代码:
class Solution {
public:
string minWindow(string s, string t) {
vector<int> m(128, 0); //记录t中字符对应的个数
for (auto c : t) m[c]++; //初始化m
int start = 0, end = 0, counter = t.size(), head = 0, len = INT_MAX; //count表示要找的字符数
while (end < s.size()) {
//若某字符在t中,则将要继续找的字符数减一
if (m[s[end]] > 0)
counter--;
// 若字符不在t中,则将字符在m的计数减一
m[s[end]]--;
end++;
//找到了合法的窗口,并从头开始缩小至最小
while (counter == 0) {
if (end - start < len) {
head = start;
len = end - start;
}
m[s[start]]++;
// 当字符在t中,说明不能继续增大start。此时要将counter加一,从而让start增加一
if (m[s[start]] > 0)
counter++;
start++;
}
}
if (len != INT_MAX)
return s.substr(head, len);
return "";
}
};
通过截图:
本题最大的收获还是在讨论中看到的解字符串问题的模板,如下: