76.最小覆盖子串**
class Solution {
public:
string minWindow(string s, string t) {
vector<int> chars(128); // 字符本身作为键k,它们的个数作为值v
vector<bool> flag(128, false); // 字符本身作为键k,它们是否存在作为值v
// 统计t中的字符情况
for (int i = 0; i < t.size(); i++) {
flag[t[i]] = true;
++chars[t[i]];
}
// 滑动窗口不断改变统计数据
int cnt = 0, l = 0, min_l = 0, min_size = s.size() + 1;
for (int r = 0; r < s.size(); ++r) {
if (flag[s[r]]) {//判断字符s[r]是否存在,存在则,判断该字符数量先减1是否大于0,记录窗口+1
if (--chars[s[r]] >= 0) {
++cnt;
}
// 若目前滑动窗口已包含T中全部字符,
// 则尝试将l右移,在不影响结果的情况下获得最短子字符串
while (cnt == t.size()) {//cnt==t.size()说明此时窗口已包含全部字符,即符合条件
if (r - l + 1 < min_size) {//记录最短窗口的左位置l,窗口长度
min_l = l;
min_size = r - l + 1;
}
//尝试移动左边界,如果移动的字符在目标字符里,且这个字符+1的数量大于0,窗口长度-1
// 如果左边界字符在T中,且将其加回需求后需求 >0,
// 说明该字符的需求又变为正数,即窗口不再完全覆盖,cnt--
if (flag[s[l]] && ++chars[s[l]] > 0) {
--cnt;
}
++l;//左移l
}
}
}
return min_size > s.size() ? "" : s.substr(min_l, min_size);
}
};
string substr(size_t pos = 0, size_t count = npos) const;
pos(第一个参数):起始索引位置(从 0 开始计数),表示从哪个字符开始截取。
count(第二个参数):要截取的字符个数(即子串的长度)。
返回值:返回一个新构造的 string 对象,包含原字符串从 pos 开始,长度为 count 的字符串

浙公网安备 33010602011771号