Короткий ответ
Палиндром — строка, которая читается одинаково слева направо и справа налево. Простейший способ проверки на Python — сравнить строку с её перевёрнутой копией: s == s[::-1]. Алгоритмический вариант — метод двух указателей, которые движутся от концов к центру и останавливаются при первом несовпадении.
Как это работает подробнее
Самый короткий путь — срез с шагом -1, который разворачивает строку; метод двух указателей даёт тот же результат без создания копии, поэтому его чаще ждут в задачах.
- Срез с шагом -1.
s[::-1]возвращает строку в обратном порядке, после чего достаточно сравнить её с оригиналом. - Функция reversed.
''.join(reversed(s))— альтернатива срезу: разворот итератора и склейка символов в новую строку. - Два указателя. Индексы идут от концов строки к центру, и при первом несовпадении символов сразу ясно, что перед нами не палиндром.
- Проверка половины. Достаточно сравнить len(s)//2 зеркальных пар, поэтому генератор
all(s[i] == s[-i-1] for i in range(len(s)//2))тоже даёт ответ.
Пример кода
Проверка палиндрома двумя указателями
def is_palindrome(s):
i, j = 0, len(s) - 1
while i < j:
if s[i] != s[j]:
return False
i += 1
j -= 1
return True
print(is_palindrome('madam')) # True
print(is_palindrome('hello')) # FalseЧто использовать на практике
- Короткая проверка. Для простых случаев хватит
s == s[::-1]— кратко и понятно. - Уточни условия. Спроси, нужно ли игнорировать регистр и пробелы, например для фразы «А роза упала на лапу Азора».
- Очистка строки. Если пробелы и регистр не важны, приведи строку к нижнему регистру и убери небуквенные символы перед проверкой.
- Экономия памяти. Для длинных строк выбирай два указателя, чтобы не создавать копию строки.
Подводные камни
- Регистр и пробелы. Фраза «А роза упала на лапу Азора» не пройдёт наивную проверку без нормализации текста.
- Пустая строка и один символ. Формально они являются палиндромами — уточни, как трактовать такие граничные случаи.
- Служебные символы. Знаки препинания и цифры нужно учитывать по согласованному правилу, иначе результат может оказаться неожиданным.
- Лишние копии. Срез и join создают копию строки, что на очень больших входных данных менее эффективно, чем указатели.
Как отвечать на собеседовании
- Начать с определения палиндрома → показать самый короткий вариант через
s[::-1]→ затем метод двух указателей и его преимущество по памяти → уточнить, нужно ли игнорировать регистр и пробелы, и при необходимости показать нормализацию входа.