Сложность: medium
Дана строка s, вернуть длину самой длинной подстроки, которая содержит не более двух различных символов.
Пример:
Input: s = "eceba"
Output: 3
Explanation: The substring is "ece" which its length is 3.
👨💻 Алгоритм:
1⃣Возвратить N, если длина строки N меньше 3. Установить оба указателя в начало строки left = 0 и right = 0 и инициализировать максимальную длину подстроки max_len = 2.
2⃣Пока указатель right меньше N:
Если в хэшмапе меньше 3 различных символов, добавить текущий символ s[right] в хэшмап и переместить указатель right вправо.
Если в хэшмапе 3 различных символа, удалить самый левый символ из хэшмапа и переместить указатель left, чтобы скользящее окно содержало только 2 различных символа.
3⃣Обновить max_len.
😎 Решение:
func lengthOfLongestSubstringTwoDistinct(_ s: String) -> Int {
let n = s.count
if n < 3 { return n }
var left = 0
var right = 0
var hashmap: [Character: Int] = [:]
var maxLen = 2
let sArray = Array(s)
while right < n {
hashmap[sArray[right]] = right
right += 1
if hashmap.count == 3 {
let delIdx = hashmap.values.min()!
hashmap.removeValue(forKey: sArray[delIdx])
left = delIdx + 1
}
maxLen = max(maxLen, right - left)
}
return maxLen
}Ставь 👍 и забирай 📚 Базу знаний