Редакция для Тайное послание
Submitting an official solution before solving the problem yourself is a bannable offence.
Автор:
Разбор задачи «Тайное послание»
Идея задачи
Нам даны две строки s и t. Нужно определить, является ли строка t строкой s, записанной в обратном порядке.
Иначе говоря, если перевернуть строку s, то должна получиться ровно строка t.
Как понять задачу
Рассмотрим пример:
s = code- если записать её справа налево, получим
edoc
Значит, если t = edoc, ответ YES.
Ещё пример:
s = hello- обратная строка:
olleh - если
t = hlelo, то это уже не подходит
Ответ будет NO.
Наблюдение
Никаких сложных преобразований здесь нет.
Нужно сделать всего одно действие:
- Перевернуть строку
s - Сравнить результат со строкой
t
Если строки совпали — выводим YES, иначе — NO.
Почему это решение правильное
По условию требуется проверить, равна ли строка t строке s, записанной в обратном порядке.
Если мы действительно перевернули s, то получили ровно ту строку, которая и должна быть во втором сообщении по условию.
Тогда:
- если перевёрнутая
sравнаt, ответ должен бытьYES - если не равна, ответ должен быть
NO
То есть наш алгоритм в точности проверяет то, что требуется в задаче.
Пошаговый алгоритм
- Считать строки
sиt - Перевернуть строку
s - Сравнить перевёрнутую строку со строкой
t - Вывести
YESилиNO
Разбор примеров
Пример 1
s = code
Переворачиваем:
edoc
Если t = edoc, то ответ:
YES
Пример 2
s = star
Переворачиваем:
rats
Если t = rats, то ответ:
YES
Пример 3
s = hello
Переворачиваем:
olleh
Но дана строка hlelo, а это не то же самое.
Значит, ответ:
NO
Реализация на C++
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main() {
string s, t;
cin >> s >> t;
reverse(s.begin(), s.end());
if (s == t) {
cout << "YES\n";
} else {
cout << "NO\n";
}
return 0;
}
Пояснение к коду на C++
cin >> s >> t;считывает две строкиreverse(s.begin(), s.end());переворачивает строкуs- дальше обычное сравнение строк:
s == t
Если строки равны, печатаем YES, иначе NO.
Реализация на Python
s = input()
t = input()
if s[::-1] == t:
print("YES")
else:
print("NO")
Пояснение к коду на Python
В Python запись s[::-1] означает «взять строку в обратном порядке».
То есть:
s[::-1]— это перевёрнутая строкаs- если она равна
t, печатаемYES - иначе печатаем
NO
Оценка сложности
Пусть длина строки равна n.
- Переворот строки занимает
O(n) - Сравнение строк тоже занимает
O(n)
Итоговая сложность:
- Время:
O(n) - Память:
O(1)дополнительно в C++ иO(n)для среза в Python
При ограничениях задачи это очень быстро.
Частые ошибки
1. Сравнивать строки без переворота
Некоторые по невнимательности проверяют просто s == t.
Но по условию нужно сравнивать t не с s, а с перевёрнутой s.
2. Перепутать направление
Нужно именно записать первую строку справа налево.
3. Пытаться делать слишком сложное решение
Здесь не нужны циклы с множеством условий, массивы частот и другие сложные конструкции. Задача решается прямой проверкой обратной строки.
Комментарии