滑动窗口一般能把O(N*K)复杂度优化到O(N)复杂度,是一个很优秀的算法。
要点就是:在保证滑动窗口内的子串满足要求的情况下,进行统计。
3. 无重复字符的最长子串 中等
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
//保证滑动窗口内的子串满足要求
for(int i = 0, j = 0; i < ns; i++) {
m[s[i]]++;
while(m[s[j]] > 1) m[s[l++]]--;
mxlen = max(mxlen, j - i + 1);
}
76. 最小覆盖字串 困难
给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串。
输入: S = "ADOBECODEBANC", T = "ABC"
输出: "BANC"
//保证窗口内的字母满足要求, c == cnt并且l不指向冗余字母时,字符串才会最短
for(int l = 0, r = 0, c = 0; r < s.size(); r++) {
if(m[s[r]] >= 1) c++; //r一直向前遍历,如果map中存在该字符则c++;
m[s[r]]--;
while(m[s[l]] < 0) m[s[l++]]++;//如果s[l]不是T中字母,则l++
if(c == cnt) {
if(res == "" || r - l + 1 < res.size())
res = s.substr(l, r - l + 1);
}
}