Программа курса:
Разбор задачи: Самая большая подстрока между двумя равными символами
Предложенный нами код решения:
def longestSubstringBetweenEqualCharacters(s):
"""
Возвращает длину самого длинного подстрока между двумя одинаковыми символами в строке.
:param s: строка
:return: длина самого длинного подстрока или -1, если таких подстрок нет
"""
char_indices = {}
max_length = -1
for i, char in enumerate(s):
if char in char_indices:
# Вычисляем длину подстроки между текущей позицией и первой встреченной позицией символа
length = i - char_indices[char] - 1
max_length = max(max_length, length)
else:
# Сохраняем индекс первого появления символа
char_indices[char] = i
return max_length1. Объявление функции
def longestSubstringBetweenEqualCharacters(s):
"""
Возвращает длину самого длинного подстрока между двумя одинаковыми символами в строке.
:param s: строка
:return: длина самого длинного подстрока или -1, если таких подстрок нет
"""
- Функция называется
longestSubstringBetweenEqualCharactersи принимает строкуsкак аргумент. - Ожидаемый результат: длина самой длинной подстроки между двумя одинаковыми символами в строке или -1, если таких подстрок нет.
2. Инициализация переменных
char_indices = {}
max_length = -1
char_indices: словарь, в котором будут храниться индексы первого появления каждого символа. Используется для того, чтобы запомнить, где был найден первый символ, и вычислить расстояние между его текущим появлением и первым.max_length: переменная для хранения максимальной длины подстроки между одинаковыми символами. Изначально устанавливается в -1, что будет означать, что такой подстроки нет, если она не будет найдена.
3. Проход по строке
for i, char in enumerate(s):
- В цикле
forмы перебираем каждый символ строкиs, используя функциюenumerate, чтобы получить как индекс (i), так и сам символ (char).
4. Проверка наличия символа в словаре
if char in char_indices:
- Проверяем, встречался ли уже символ
charв строке (то есть, был ли он сохранен в словареchar_indices). Если символ встречался ранее, значит, мы нашли пару одинаковых символов, между которыми можем вычислить длину подстроки.
5. Вычисление длины подстроки
length = i - char_indices[char] - 1
max_length = max(max_length, length)
Если символ уже встречался, мы вычисляем длину подстроки между текущим индексом
iи индексом первого появления символа, который мы нашли в словареchar_indices[char].Формула
i - char_indices[char] - 1позволяет исключить сами символы и вычислить длину подстроки между ними.- После этого обновляем
max_lengthтак, чтобы он всегда хранил максимальную длину найденной подстроки. Если текущая длина больше уже найденной максимальной, тоmax_lengthобновляется.
6. Сохранение индекса первого появления символа
else:
char_indices[char] = i
- Если символ встречается в строке впервые, сохраняем его индекс в словарь
char_indices, чтобы при следующем встрече этого символа можно было вычислить длину подстроки между одинаковыми символами.
7. Возвращение результата
return max_length
- После завершения цикла, возвращаем
max_length, который содержит максимальную длину подстроки между одинаковыми символами. Если подстрок с одинаковыми символами не было,max_lengthостанется равным -1.
Пример работы кода
Возьмем строку s = "abca".
- Перебираем символы строки:
- При первом проходе встречаем 'a'. Он не встречался раньше, сохраняем его индекс в словарь
char_indices = {'a': 0}. - При втором проходе встречаем 'b'. Он не встречался раньше, сохраняем его индекс в словарь
char_indices = {'a': 0, 'b': 1}. - При третьем проходе встречаем 'c'. Он не встречался раньше, сохраняем его индекс в словарь
char_indices = {'a': 0, 'b': 1, 'c': 2}. - При четвертом проходе снова встречаем 'a'. Мы уже встречали 'a' на индексе 0. Вычисляем длину подстроки:
3 - 0 - 1 = 2. Обновляемmax_lengthна 2.
- При первом проходе встречаем 'a'. Он не встречался раньше, сохраняем его индекс в словарь
- Результат:
max_length = 2.
Возможные улучшения
- Это решение эффективно работает для строк с малым и средним размером. В случае очень длинных строк можно рассмотреть оптимизацию по памяти, но для большинства стандартных случаев оно будет работать достаточно быстро.
Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии