给你一个字符串 s
,请你找出 至多 包含 两个不同字符 的最长子串,并返回该子串的长度。
示例 1:
输入:s = "eceba" 输出:3 解释:满足题目要求的子串是 "ece" ,长度为 3 。
示例 2:
输入:s = "ccaabbb" 输出:5 解释:满足题目要求的子串是 "aabbb" ,长度为 5 。
提示:
1 <= s.length <= 10^5
s
由英文字母组成
解法:双指针滑动窗口
class Solution {
public int lengthOfLongestSubstringTwoDistinct(String s) {
int valid = 0;
Map<Character, Integer> window = new HashMap<>();
int ans = 1;
int left = 0;
int right = 0;
while (right < s.length()) {
char c = s.charAt(right);
if (window.getOrDefault(c, 0) == 0) {
valid++;
}
window.put(c, window.getOrDefault(c, 0) + 1);
// 窗口缩小,左指针右移
while (valid > 2) {
char delete = s.charAt(left);
left++;
if (window.get(delete).equals(1)) {
valid--;
}
window.put(delete, window.get(delete) - 1);
}
ans = Math.max(ans, right - left + 1);
right++;
}
return ans;
}
}
时间复杂度
- 时间复杂度:O(n), n 是字符串 s 的长度。
- 空间复杂度:O(k),k 是 s 的字符集合的长度。