解题思路
-
本质上还是双指针;
-
构造一个滑动窗口,先移动右指针,使得能够包含目标字符串,然后再尝试移动左指针,使得包含失效,再继续移动右指针,在这个过程中,记录目标解;
-
剩下的就是代码实现上的细节了。
代码
class Solution {
public:
string minWindow(string s, string t) {
vector<int> remained(128, 0);
for (auto c : t) {
remained[c]++;
}
int left = 0, right = 0, start = 0, minL = INT_MAX;
int need = t.size();
while (right < s.size()) {
if (remained[s[right]]-- > 0) {
need--;
}
right++;
while (need == 0) {
if (right - left < minL) {
minL = right - left;
start = left;
}
if (remained[s[left]]++ == 0) {
need++;
}
left++;
}
}
return (minL == INT_MAX) ? "":s.substr(start, minL);
}
};