Задача. Палиндром
Условие задачи
Палиндром — это строка, которая одинаково читается слева направо и справа налево. Составьте программу, которая проверяет, является ли заданный текст палиндромом. Не забудьте, что при чтении пробел никак не произносится.
Входные данные
Дана строка [latex]S[/latex], [latex]|S| \leq 255[/latex], состоящая из строчных латинских букв и пробелов. Под [latex]|S|[/latex] подразумевается длина строки.
Выходные данные
Требуется вывести «YES«, если текст является палиндромом, «NO» если не является.
Также условие задачи можно посмотреть здесь.
Тестирование
№ | Входные данные | Выходные данные |
1. | palindrom | NO |
2. | a roza upala na lapu azora | YES |
3. | my gym | YES |
4. | character | NO |
Реализация (с использованием c-string)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int main() { const int startSize = 256; char s[startSize]; char s_1[startSize]; cin.getline(s, 256); int j = 0; for (int i = 0; i < startSize; i++) { if (s[i] == ' ') continue; //учитываем, что пробел при чтении никак не произносится s_1[j] = s[i]; j++; } int resSize = strlen(s_1); char * s_2 = new char[resSize + 1]; for (int i = 0; i < resSize; i++) { s_2[i] = s_1[resSize - 1 - i]; } s_2[resSize] = '\0'; if (!strcmp(s_1, s_2)) { cout << "YES\n"; } else { cout << "NO\n"; } return 0; } |
Алгоритм решения (c-string)
С помощью функции [latex]strcmp()[/latex] сравниваем символы строк [latex] s_1[/latex] и [latex]s_2[/latex], предварительно учтя тот факт, что пробел при чтении никак не произносится. Если они идентичны, введенный текст одинаково читается слева направо и справа налево, то есть является палиндромом. В противном случае, текст палиндромом не является. Важно отметить, что функция [latex]strcmp()[/latex] учитывает регистр введенных символов, согласно условию мы должны использовать строчные латинские буквы.
Для запроса на выполнение следует перейти по ссылке.
Ссылка на засчитанное решение на e-olymp.com.
Реализация (с использованием string)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
#include <iostream> #include <string> using namespace std; int main() { string s; char c; while (cin >> c) { if (c != ' ') s.push_back(c); } if (s.empty()) { cout << "YES"; return 0; } bool palindrom = true; for (int i = 0; i <= s.length()/2; i++) { if (s.at(i) != s.at(s.length()-1-i)) { palindrom = false; break; } } cout << (palindrom ? "YES" : "NO"); return 0; } |
Алгоритм решения (string)
Сравниваем соответствующие символы строки до середины, проверяя тем самым, читается ли введенный текст одинаково справа налево и слева направо, то есть является палиндромом. Учитываем, что пробел при чтении никак не произносится: считываем из входного потока по символу и помещаем в строку только буквы.
Для запроса на выполнение следует перейти по ссылке.
Ссылка на засчитанное решение на e-olymp.com.
Хорошо.
Теперь можно попробовать сделать тоже самое с использованием string
Игорь Евгеньевич, добавила код с использованием string.
Хорошо, зачтено.