3. 无重复字符的最长子串
滑动窗口
class Solution {
public:
int lengthOfLongestSubstring(string s) {
set<char> window;
// ans 应该初始化为0而不是负数,以适应s为空的情况
int l = 0, ans = 0;
for (int r = 0; r < s.size(); ++r) {
char c = s[r];
while (window.count(c)) {
window.erase(s[l++]);
}
window.insert(c);
ans = max(ans, (int) window.size());
}
return ans;
}
};
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
window = set()
l = 0
max_len = 0
for r in range(len(s)):
# 右端点元素进窗口之前,需要通过不断右移左端点保证当前窗口所有元素唯一
while s[r] in window:
window.remove(s[l])
l += 1
window.add(s[r])
max_len = max(max_len, r - l + 1) # 可以用 len(windows)代替
return max_len
- 至多包含 K 个不同字符的最长子串
class Solution:
def lengthOfLongestSubstringKDistinct(self, s: str, k: int) -> int:
window = {}
l = 0
max_len = 0
for r in range(len(s)):
window[s[r]] = window.get(s[r], 0) + 1
# 注意是 <= ,考虑 k=0 的边界
while l <= r and len(window) > k:
window[s[l]] -= 1
if window[s[l]] == 0:
window.pop(s[l])
l += 1
max_len = max(max_len, r - l + 1)
return max_len
- 992.K 个不同整数的子数组
挂起