Сравнивайте символы двумя индексами от краёв к центру. При первом различии верните False; если индексы встретились, строка — палиндром. Дополнительная память O(1).
Определение палиндрома строки без использования дополнительного пространства
Сравнивайте символы двумя индексами от краёв к центру. При первом различии верните False; если индексы встретились, строка — палиндром. Дополнительная память O(1).
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Реализуйте функцию, принимающую строку и возвращающую true, если она читается одинаково слева направо и справа налево. При этом решение не должно выделять дополнительную память (никакие массивы, новые строки и т.п.).
Ответ
Сравнивайте символы двумя индексами от краёв к центру. При первом различии верните False; если индексы встретились, строка — палиндром. Дополнительная память O(1).
Вариант с точным сравнением символов:
def is_palindrome(text):
left, right = 0, len(text) - 1
while left < right:
if text[left] != text[right]:
return False
left += 1
right -= 1
return True
Пустая строка и строка из одного символа считаются палиндромами. Регистр, пробелы и пунктуация здесь значимы: их игнорирование не задано. В отличие от text[::-1], алгоритм не создаёт копию всей строки и выполняет O(n) сравнений.