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 的字符串

posted @ 2026-07-11 18:06  Acyclonepl  阅读(2)  评论(0)    收藏  举报