Зеркальное заклинание
Условие
В одной игре есть «зеркальное заклинание»: оно срабатывает, только если строка читается одинаково слева направо и справа налево.
Тебе дали строку с заклинанием. Проверь, сработает ли оно.
Строку сравнивай как есть: все символы важны, регистр не менять.
Формат ввода
Одна строка s.
Формат вывода
Выведи YES, если s — палиндром, иначе выведи NO.
Ограничения
1 ≤ |s| ≤ 2000- строка состоит из латинских букв (a–z, A–Z) и цифр (0–9)
Пример
Ввод:
abacaba
Вывод:
YESКак решать — идея подхода
Приём: Два указателя (сравнение с концов)
Ключевое наблюдение: строка — палиндром тогда и только тогда, когда для каждого i символ слева равен симметричному символу справа: s[i] == s[n-1-i].
Чтобы не строить новую строку и не делать лишнюю память, удобно идти «навстречу» двумя указателями.
Почему это работает: если хоть одна пара симметричных символов не совпала, палиндрома уже не получится; если все пары совпали до середины, строка читается одинаково в обе стороны.
План решения:
- Считай строку
sи убери только перевод строки в конце (если он есть). - Заведи два индекса:
l = 0,r = len(s) - 1. - Пока
l < r: - если
s[l] != s[r], сразу ответNO. - иначе сдвинься к центру:
l += 1,r -= 1. - Если цикл закончился без ошибок, ответ
YES.
Сложность: O(n) по времени и O(1) по памяти, где n — длина строки.
Частая ошибка: забыть убрать \n при чтении — тогда последний символ станет переводом строки, и почти любой ввод даст NO.
Разберись руками
Заклинание работает, если строка выглядит одинаково слева направо и справа налево. На примере строки "abacaba" попробуем руками проверить это через сравнение символов с концов.
- Строка: "abacaba". Индексы считаем с 0. Отметь ИНДЕКСЫ левой части, для которых нужно сравнить символ с «зеркальным» символом справа (то есть сравнение идёт парами с концов).
- Какие пары символов реально сравниваются в этом примере (если идём с концов к середине)?
- Сколько сравнений нужно сделать для строки "abacaba" (длина 7), если сравниваем попарно с концов и останавливаемся у середины?
- В "abacaba" все эти пары совпадают: a=a, b=b, a=a. Что нужно вывести?
Идея: Сравнивай символы попарно: первый с последним, второй с предпоследним и так далее, двигаясь к середине. Если нашлась хотя бы одна несовпавшая пара — это не палиндром; если все пары совпали — палиндром.
Решить задачу с автопроверкой на Python →
Куда дальше
- С нуля до олимпиады: маршрут — сколько занимает язык, какие приёмы нужны и к какому этапу это ведёт
- Вердикты судьи: WA, TLE, RE, PE, CE — что значит каждый код проверяющей системы и где искать причину
- Python на олимпиадах — где языка хватает с запасом, а где начинают значить лимиты — с замерами