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