维护一个s的窗口子串,如果它涵盖t中所有字符,就将左指针右移,即将最左边的元素移出窗口。判断涵盖t可以使用两个数组分别统计当前s和t的字符数情况,然后每次逐个字符判断,这样每次都要花费 O(∣Σ∣) 的时间去判断是否涵盖。因此可以用一个变量less代替,即目前子串中有 less 种字母的出现次数小于 t 中字母的出现次数。
初始化左右指针。
用一个哈希表统计t的字符情况。
初始化left,并用一个哈希表统计s的情况。
初始化 less 为 t 中的不同字母个数。
遍历 s,设当前枚举的子串右端点为 right,把字母 c=s[right] 的出现次数加一。加一后,如果 cntS[c]=cntT[c],说明 c 的出现次数满足要求,把 less 减一。
classSolution { public: string minWindow(string s, string t){ int m = s.length(); int n = t.length(); int ansLeft = -1, ansRight = m; int cnt[128]{}; int less = 0; for(char c : t){ if(cnt[c] == 0){ less++; } cnt[c]++; }
// 滑动窗口 int left = 0; for(int right = 0; right < m; right++){ char c = s[right]; cnt[c]--; if(cnt[c] == 0){ less--; }