Skip to content

LC159.至多包含两个不同字符的最长子串

1. 题目

给你一个字符串 s ,请你找出至多 包含 两个不同字符 的最长子串,并返回该子串的长度。

示例 1:

markdown
**输入:** s = "eceba"
**输出:** 3
**解释:** 满足题目要求的子串是 "ece" ,长度为 3 。

示例 2:

markdown
**输入:** s = "ccaabbb"
**输出:** 5
**解释:** 满足题目要求的子串是 "aabbb" ,长度为 5 。

提示:

  • 1 <= s.length <= 10^5
  • s 由英文字母组成

2. 思路

  1. 如何确定“只有两个不同元素”:维护一个记录字符出现次数的哈希表 rec,判定 rec 当中的 KV 规模,如果规模为 x,那么就有 x不同元素
  2. 此题为非常标准的滑动窗口模板题

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
}