Зеркальное заклинание

тема: Строки · уровень: базовый

Условие

В одной игре есть «зеркальное заклинание»: оно срабатывает, только если строка читается одинаково слева направо и справа налево.

Тебе дали строку с заклинанием. Проверь, сработает ли оно.

Строку сравнивай как есть: все символы важны, регистр не менять.

Формат ввода

Одна строка s.

Формат вывода

Выведи YES, если s — палиндром, иначе выведи NO.

Ограничения

Пример

Ввод:

abacaba

Вывод:

YES

Как решать — идея подхода

Приём: Два указателя (сравнение с концов)

Ключевое наблюдение: строка — палиндром тогда и только тогда, когда для каждого i символ слева равен симметричному символу справа: s[i] == s[n-1-i].

Чтобы не строить новую строку и не делать лишнюю память, удобно идти «навстречу» двумя указателями.

Почему это работает: если хоть одна пара симметричных символов не совпала, палиндрома уже не получится; если все пары совпали до середины, строка читается одинаково в обе стороны.

План решения:

Сложность: O(n) по времени и O(1) по памяти, где n — длина строки.

Частая ошибка: забыть убрать \n при чтении — тогда последний символ станет переводом строки, и почти любой ввод даст NO.

Разберись руками

Заклинание работает, если строка выглядит одинаково слева направо и справа налево. На примере строки "abacaba" попробуем руками проверить это через сравнение символов с концов.

Идея: Сравнивай символы попарно: первый с последним, второй с предпоследним и так далее, двигаясь к середине. Если нашлась хотя бы одна несовпавшая пара — это не палиндром; если все пары совпали — палиндром.

Решить задачу с автопроверкой на Python →

Куда дальше