Problem
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.
Solution
右边每次进来一个字符,并计算以它为最右边界的窗口的最大值。
当加入该字符后,如果数字超过2,那就要考虑去掉当前字符串中的哪个字符之后使得窗口最长,当然是让左边界最小了。
class Solution {
public:
int lengthOfLongestSubstringTwoDistinct(string s) {
int rst = 0;
const int N = s.size(), K = 2;;
unordered_map<char, int> mp;
for( int left = 0, right = 0; right < s.size(); right++){
mp[s[right]] = right;
if(mp.size() > K ){
int rightMost = right;
char rightMostChar = ' ';
for( auto it = mp.begin(); it != mp.end(); it++){
if(it->second < rightMost){
rightMost = it->second;
rightMostChar = it->first;
}
}
mp.erase(rightMostChar);
left = rightMost + 1;
}
rst = max(rst, right - left + 1);
}
return rst;
}
};
以上代码适用于K distinct characters.
对于只有两个情况下,可以优化空间复杂度成为常量
class Solution {
public:
int lengthOfLongestSubstringTwoDistinct(string s) {
if(s.empty()) return 0;
int rst = 0, j = -1;
int left = 0, right = 0;
for( ; right < s.size(); right++){
if( right == 0 || s[right] == s[right-1]) continue;
if( j >= 0 && s[right] != s[j] && s[right] != s[left]){
rst = max(rst, right - left);
left = j + 1;
}
j = right - 1;
}
return max( right - left, rst);
}
};