给定一个字符串 s ,找出 至多 包含两个不同字符的最长子串 t ,并返回该子串的长度。
示例 1:
输入: "eceba" 输出: 3 解释: t 是 "ece",长度为3。
示例 2:
输入: "ccaabbb" 输出: 5 解释: t 是 "aabbb",长度为5。
哈希表 + 双指针。
class Solution:
def lengthOfLongestSubstringTwoDistinct(self, s: str) -> int:
mp = Counter()
i = j = ans = 0
for c in s:
mp[c] += 1
while len(mp) > 2:
mp[s[i]] -= 1
if mp[s[i]] == 0:
mp.pop(s[i])
i += 1
ans = max(ans, j - i + 1)
j += 1
return ans
class Solution {
public int lengthOfLongestSubstringTwoDistinct(String s) {
Map<Character, Integer> mp = new HashMap<>();
int i = 0, j = 0, ans = 0;
for (char c : s.toCharArray()) {
mp.put(c, mp.getOrDefault(c, 0) + 1);
while (mp.size() > 2) {
char t = s.charAt(i);
mp.put(t, mp.get(t) - 1);
if (mp.get(t) == 0) {
mp.remove(t);
}
++i;
}
ans = Math.max(ans, j - i + 1);
++j;
}
return ans;
}
}
class Solution {
public:
int lengthOfLongestSubstringTwoDistinct(string s) {
unordered_map<char, int> mp;
int i = 0, j = 0, ans = 0;
for (char& c : s)
{
++mp[c];
while (mp.size() > 2)
{
--mp[s[i]];
if (mp[s[i]] == 0) mp.erase(s[i]);
++i;
}
ans = max(ans, j - i + 1);
++j;
}
return ans;
}
};
func lengthOfLongestSubstringTwoDistinct(s string) int {
mp := make(map[byte]int)
i, j, ans := 0, 0, 0
for _, c := range s {
mp[byte(c)]++
for len(mp) > 2 {
mp[s[i]]--
if mp[s[i]] == 0 {
delete(mp, s[i])
}
i++
}
ans = max(ans, j-i+1)
j++
}
return ans
}
func max(a, b int) int {
if a > b {
return a
}
return b
}