LC159.至多包含两个不同字符的最长子串
1. 题目
给你一个字符串 s
,请你找出至多 包含 两个不同字符 的最长子串,并返回该子串的长度。
示例 1:
markdown
**输入:** s = "eceba"
**输出:** 3
**解释:** 满足题目要求的子串是 "ece" ,长度为 3 。
示例 2:
markdown
**输入:** s = "ccaabbb"
**输出:** 5
**解释:** 满足题目要求的子串是 "aabbb" ,长度为 5 。
提示:
1 <= s.length <= 10^5
s
由英文字母组成
2. 思路
- 如何确定“只有两个不同元素”:维护一个记录字符出现次数的哈希表
rec
,判定rec
当中的KV
规模,如果规模为x
,那么就有x
个不同元素。 - 此题为非常标准的滑动窗口模板题。
3. 代码
go
func lengthOfLongestSubstringTwoDistinct(s string) int {
n := len(s)
left, right := 0, 0
rec := map[byte]int{}
ans := 0
for right = 0; right < n; right++ {
rec[s[right]] ++
for len(rec) >= 3 && left <= right {
if _, has := rec[s[left]]; has {
rec[s[left]] --
if rec[s[left]] == 0 {
delete(rec, s[left])
}
}
left++
}
if ans < right - left + 1 {
ans = right - left + 1
}
}
return ans
}