159.至多包含两个不同字符的最长子串
方法:滑动窗口
定义两个指针left和right作为窗口的边界,将两个指针都设定在位置0,然后向右移动right指针,直到窗口内不超过两个不同的字符,如果某一点我们得到了3个不同的字符,那么需要移动left指针,窗口内最多只能有2个不同的字符。
建立一个哈希表,键是滑动窗口中的所有字符,值是它们最右端的位置,在每一刻,这个哈希表最多只能包含3个元素
class Solution {
public int lengthOfLongestSubstringTwoDistinct(String s) {
int n = s.length();
if(n < 3){
return n;
}
//滑动窗口的左右指针
int left = 0,right = 0;
//定义一个哈希映射,hashMap中的字符->它在滑动窗口中最靠右的位置
HashMap<Character,Integer> hashmap = new HashMap<Character,Integer>();
int max_len = 2;
while(right < n){
//当滑动窗口包含小于3个字符
hashmap.put(s.charAt(right),right++);
//滑动窗口包含3个字符
if(hashmap.size() ==3){
//删除最左边的字符
int del_idx = Collections.min(hashmap.values());
hashmap.remove(s.charAt(del_idx));
//删除滑动窗口的左指针
left = del_idx + 1;
}
max_len = Math.max(max_len,right - left);
}
return max_len;
}
}