Разбор задачи:

Предложенный нами код решения:

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. Инициализация переменных

В начале программы:

  1. n = len(s) — Определяется длина строки s, чтобы знать, сколько символов необходимо обработать.
  2. result = [float('inf')] * n — Создается список длиной n, заполненный значениями бесконечности (float('inf')). Это временные значения, которые позже будут заменены минимальными расстояниями.
    • Использование бесконечности позволяет корректно сравнивать значения на этапе минимизации.
  3. prev = -float('inf') — Инициализируется переменная prev, которая будет хранить индекс последнего встреченного символа c. Она изначально равна отрицательной бесконечности, так как символ c еще не найден.

Шаг 2. Проход слева направо

Цикл for i in range(n) перебирает каждый символ строки s слева направо:

  1. Если текущий символ s[i] равен c (проверка if s[i] == c):
    • Обновляем значение prev на текущий индекс i, так как найден новый символ c.
  2. Независимо от того, был ли найден символ c, вычисляем расстояние от текущего индекса i до последнего найденного индекса prev:
    • result[i] = i - prev — Расстояние до ближайшего слева символа c записывается в список result.

Шаг 3. Проход справа налево

После завершения первого прохода в списке result содержатся расстояния только до ближайшего символа c, который находится слева. Теперь выполняется второй проход справа налево:

  1. prev = float('inf') — Перед началом второго прохода переменная prev переустанавливается в значение бесконечности (float('inf')), чтобы учесть расстояния до ближайшего символа c, находящегося справа.
  2. Цикл 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"

  1. Инициализация:
    • n = 12
    • result = [inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf]
    • prev = -inf
  2. Проход слева направо:
    • Индекс 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].
  3. Проход справа налево:
    • Индекс 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]

 



Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии