Longest Substring with At Most Two Distinct Characters

Given a string s, return the length of the longest substring that contains at most two distinct characters.

Example 1:

Input: s = "eceba"
Output: 3
Explanation: The substring is "ece" which its length is 3.

Example 2:

Input: s = "ccaabbb"
Output: 5
Explanation: The substring is "aabbb" which its length is 5.

Constraints:

  • 1 <= s.length <= 105
  • s consists of English letters.

Solution

Since we don't know the size of the window, we will apply the flexible sliding window template. We will keep a last_occurrence hashmap that stores the last occurence of a character in the current window. Every time the right pointer reaches a new character, we update that character's last occurrence to r. In every iteration, we will check whether the current window is longer than max_len. This means that whenever the window becomes invalid, we must update the window first before the check. We will update l when condition(window) evaluates to true. Here, condition(window) is when the hashmap contains three characters. We must discard the entirety of one character c, which means we will choose the smaller last_occurrence[c] to maintain a longers substring. So the new left pointer is updated to min(last_occurrence.values())+1 and we will delete this character from the last_occurrence hashmap.

Implementation

1def lengthOfLongestSubstringTwoDistinct(self, s):
2    last_occurrence = dict()
3    max_len, l = 0, 0
4    for r in range(len(s)):
5        last_occurrence[s[r]] = r
6        r += 1
7        if len(last_occurrence) == 3:
8            l = min(last_occurrence.values())+1
9            del last_occurrence[s[l-1]]
10        max_len = max(max_len, r - l)
11    return max_len

Ready to land your dream job?

Unlock your dream job with a 2-minute evaluator for a personalized learning plan!

Start Evaluator
Discover Your Strengths and Weaknesses: Take Our 2-Minute Quiz to Tailor Your Study Plan:
Question 1 out of 10

Problem: Given a list of tasks and a list of requirements, compute a sequence of tasks that can be performed, such that we complete every task once while satisfying all the requirements.

Which of the following method should we use to solve this problem?


Recommended Readings

Got a question?ย Ask the Monster Assistantย anything you don't understand.

Still not clear? ย Submitย the part you don't understand to our editors. Or join ourย Discord and ask the community.

Coding Interview Strategies

Dive into our free, detailed pattern charts and company guides to understand what each company focuses on.

See Patterns
โ†
โ†‘๐Ÿช„