题目描述:
给定一个字符串 s ,找出 至多 包含两个不同字符的最长子串 t 。
示例 1:
输入: “eceba”
输出: 3
解释: t 是 “ece”,长度为3。
示例 2:
输入: “ccaabbb”
输出: 5
解释: t 是 “aabbb”,长度为5
解题思路:
可以利用双指针(i,j)在字符串上进行移动,来判定满足要求的最长子串。那么指针如何计算长度,i怎么移动,j怎么移动呢?
-
很显然,子串的长度就是i与j之间的距离
-
i就在for循环下,一直往前走
-
j显然要在(i,j)之间包含的字符种类数超过2个时进行移动,一直要使(i,j)之间包含的字符种类数为2,那如何统计二者之间的字符种类数呢?、
- hash表显然是一个好的工具,统计(i,j)之间的字符种类数-------------->hash.size()
- 当(i,j)不再包含某个字符,则需要在hash表中更新(删除它)------->hash.erase(key)
提交代码
class Solution {
public:
int lengthOfLongestSubstringTwoDistinct(string s) {
unordered_map<char, int> map;//定义哈希表
int result=0;
//i代表字符串的字符,j代表hash表的
for(int i=0,j=0;i<s.size();i++)
{
map[s[i]]++;//统计扫描的字符,当前各自的个数
while(map.size()>2)//若当前统计了2个字符
{
map[s[j]]--;//统计的字符中,最前面的下标,一个一个移动
if(map[s[j]]==0)//若j号字符已经减为0,说明这个字符是现在统计的多余的那个
{
map.erase(s[j]);
}
j++;
}
result=max(result,i-j+1);
}
return result;
}
};