159 Longest Substring with At Most Two Distinct Characters
Given a string, find the length of the longest substring T that contains at most 2 distinct characters.
For example, Given s =“eceba”,
T is "ece" which its length is 3.
这题没有套模板,不过还是silidng那个window。注意判断条件:left < right 和 hm.get(leftchar) > 1
public int lengthOfLongestSubstringTwoDistinct(String s) {
if (s == null || s.length() == 0) {
return 0;
}
HashMap<Character, Integer> hm = new HashMap<>();
int maxLen = 0;
int left = 0;
for (int right = 0; right < s.length(); right++) {
Character rightChar = s.charAt(right);
if (hm.containsKey(rightChar)) {//用一个hashmap来记录目前窗口的char和数目
hm.put(rightChar, hm.get(rightChar) + 1);
} else {
hm.put(rightChar, 1);
}
if (hm.size() <= 2) {//如果发现现在窗口里有多于2个不同的字符时,更新长度。这里用了size来记录distinct chars的个数
int curLen = right - left + 1;
maxLen = Math.max(maxLen, curLen);
} else {
// 算完长度,就把窗口左边界往后移,知道当前窗口所含的distinct chars小于2
while (left < right && hm.size() > 2) {
Character leftChar = s.charAt(left);
if (hm.get(leftChar) > 1) {
hm.put(leftChar, hm.get(leftChar) - 1);
} else {
hm.remove(leftChar);
}
left++;
}
}
}
return maxLen;
}
Java8写法:
public int lengthOfLongestSubstringTwoDistinct(String s) {
if (s == null || s.length() == 0) {
return 0;
}
Map<Character, Integer> map = new HashMap<>();
int max = 0;
int left = 0;
for (int right = 0; right < s.length(); right++) {
map.put(s.charAt(right), map.getOrDefault(s.charAt(right), 0) + 1);
while (map.size() > 2) {
int num = map.get(s.charAt(left)) - 1;
if (num == 0) {
map.remove(s.charAt(left));
} else {
map.put(s.charAt(left), num);
}
left++;
}
max = Math.max(max, right - left + 1);
}
return max;
}