Палиндром — строка, равная своему отражению. Сначала очищаем строку, потом сравниваем со срезом-перевёрткой.
def is_palindrome(s: str) -> bool:
cleaned = "".join(ch.lower() for ch in s if ch.isalnum())
return cleaned == cleaned[::-1]
print(is_palindrome("А роза упала на лапу Азора")) # True
print(is_palindrome("Кошка")) # False
print(is_palindrome("Argentina manía la tina nigre A")) # False (пример)
Разбор:
ch.isalnum() — оставляет только буквы и цифры (отбрасывает пробелы и знаки препинания).
ch.lower() приводит к одному регистру.
cleaned[::-1] — перевёрнутая строка.
Альтернатива без среза — двумя указателями left/right, как в задаче с reverse. Сложность $O(n)$.