Longest Substring with At Most Two Distinct Characters
Source
- leetcode: 159
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.
题解
我们遍历字符串时用一个哈希表,但这个哈希表只记录两个东西,一个字母和它上次出现的时的下标,另一个字母和它上次出现时候的下标。这样,如果新来的字母已经存在与表中,或者表中现在少于两个字母,就没关系,我们只要更新下它新的下标就行了。如果不存在于表中,则找出表中两个字母中,靠前面的那个,然后把这个较前的字母去掉,再加入这个新的字母。这样,我们就能维护一个窗口,保证其中只有两种字母。每次加入新字母时,说明上一个子串已经达到最长了,这时候我们判断下时候要更新全局最长子串就行了。这个通过用哈希表记录字母上次出现的下标,来维护一个窗口的方法也可以用于Longest Substring Without Repeating Characters
。
Java
public class Solution {
public int lengthOfLongestSubstringTwoDistinct(String s) {
if(s.length() < 1) return 0;
HashMap<Character,Integer> index = new HashMap<Character,Integer>();
int lo = 0;
int hi = 0;
int maxLength = 0;
while(hi < s.length()) {
if(index.size() <= 2) {
char c = s.charAt(hi);
index.put(c, hi);
hi++;
}
if(index.size() > 2) {
int leftMost = s.length();
for(int i : index.values()) {
leftMost = Math.min(leftMost,i);
}
char c = s.charAt(leftMost);
index.remove(c);
lo = leftMost+1;
}
maxLength = Math.max(maxLength, hi-lo);
}
return maxLength;
}
}