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;}
}