Программа курса:
Разбор задачи:
Предложенный нами код решения:
def shortestToChar(s, c):
"""
:type s: str
:type c: str
:rtype: List[int]
"""
n = len(s)
result = [float('inf')] * n
prev = -float('inf')
# Сначала проход слева направо
for i in range(n):
if s[i] == c:
prev = i
result[i] = i - prev
# Теперь проход справа налево
prev = float('inf')
for i in range(n - 1, -1, -1):
if s[i] == c:
prev = i
result[i] = min(result[i], prev - i)
return result
Шаг 1. Инициализация переменных
В начале программы:
n = len(s)— Определяется длина строкиs, чтобы знать, сколько символов необходимо обработать.result = [float('inf')] * n— Создается список длинойn, заполненный значениями бесконечности (float('inf')). Это временные значения, которые позже будут заменены минимальными расстояниями.- Использование бесконечности позволяет корректно сравнивать значения на этапе минимизации.
prev = -float('inf')— Инициализируется переменнаяprev, которая будет хранить индекс последнего встреченного символаc. Она изначально равна отрицательной бесконечности, так как символcеще не найден.
Шаг 2. Проход слева направо
Цикл for i in range(n) перебирает каждый символ строки s слева направо:
- Если текущий символ
s[i]равенc(проверкаif s[i] == c):- Обновляем значение
prevна текущий индексi, так как найден новый символc.
- Обновляем значение
- Независимо от того, был ли найден символ
c, вычисляем расстояние от текущего индексаiдо последнего найденного индексаprev:result[i] = i - prev— Расстояние до ближайшего слева символаcзаписывается в списокresult.
Шаг 3. Проход справа налево
После завершения первого прохода в списке result содержатся расстояния только до ближайшего символа c, который находится слева. Теперь выполняется второй проход справа налево:
prev = float('inf')— Перед началом второго прохода переменнаяprevпереустанавливается в значение бесконечности (float('inf')), чтобы учесть расстояния до ближайшего символаc, находящегося справа.- Цикл
for i in range(n - 1, -1, -1)идет по строке с конца в начало:- Если текущий символ
s[i]равенc, обновляемprevна текущий индексi. - Для каждого индекса обновляем значение в
result[i]как минимальное расстояние до символаc, учитывая два направления:- Расстояние до ближайшего символа
cслева уже записано. - Новое расстояние до символа
cсправа вычисляется какprev - i.
- Расстояние до ближайшего символа
- Итоговое значение
result[i] = min(result[i], prev - i)обновляется минимальным из двух возможных расстояний.
- Если текущий символ
Шаг 4. Возврат результата
После двух проходов список result содержит минимальные расстояния до ближайшего символа c для каждого символа строки s. Функция возвращает этот список.
Пример разбора на входных данных
Вход:s = "loveleetcode", c = "e"
- Инициализация:
n = 12result = [inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf]prev = -inf
- Проход слева направо:
- Индекс
3: символe, обновляемprev = 3,result[3] = 0. - Индекс
5: символe, обновляемprev = 5,result[5] = 0. - Индекс
6: символe, обновляемprev = 6,result[6] = 0. - Промежуточный результат:
[3, 2, 1, 0, 1, 0, 0, 1, 2, 3, 4, 5].
- Индекс
- Проход справа налево:
- Индекс
11: символe, обновляемprev = 11,result[11] = 0. - Индекс
6: символe, обновляемprev = 6,result[6] = 0. - Индекс
3: символe, обновляемprev = 3,result[3] = 0. - Итоговый результат:
[3, 2, 1, 0, 1, 0, 0, 1, 2, 2, 1, 0].
- Индекс
Возвращаемый результат: [3, 2, 1, 0, 1, 0, 0, 1, 2, 2, 1, 0]
Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии