Палиндром ли строка
Вводится строка. Определить, является ли она палиндромом, и вывести соответствующее сообщение. Палиндромом называется слово или фраза, которые читаются одинаково справа налево и слева направо.
Решение задачи на языке программирования Python
"Классический" алгоритм:
# ввод строки s = input() # длина строки length = len(s) # Находим длину половины строки делением нацело на 2. # Если количество символов нечетно, то стоящий в середине # не учитывается, т.к его сравниваемая пара - он сам. half_length = length // 2 # количество итераций цикла равно длине половины строки for i in range(half_length): # Если символ с индексом i не равен "симметричному" # символу с конца строки (который находится путем # индексации с конца), if s[i] != s[-1-i]: # то выводится сообщение, что строка не палиндром. print("It's not palindrome") # выход из программы quit() # До этого места кода программа дойдет, если не произойдет # выход из программы в цикле выше. # Если выхода не произошло, значит строка - палиндром. print("It's palindrome")
Примеры выполнения:
banana It's not palindrome
anna It's palindrome
Решение с циклом while будет таким же, за исключением необходимости менять значение переменной i "вручную" в теле цикла. Условием цикла при этом будет выражение i < half_length.
Вместо выхода из программы можно использовать оператор прерывания цикла break и ветку else цикла (такие позволительны в языке программирования Python):
s = input() half_length = len(s) // 2 for i in range(half_length): if s[i] != s[-1-i]: print("It's not palindrome") break else: print("It's palindrome")
Чтобы написать программу с break без ветки else цикла, пришлось бы ввести флаговую переменную, значение которой "сбрасывать" перед досрочным выходом из цикла:
s = input() half_length = len(s) // 2 flag = True for i in range(half_length): if s[i] != s[-1-i]: flag = False break if flag: print("It's palindrome") else: print("It's not palindrome")
Принципиально другой способ решения — перевернуть строку и сравнить ее с исходной. Если строки окажутся равными, мы имеем дело с палиндромом.
s = input() s2 = '' for i in s: s2 = i + s2 if s == s2: print('Палиндром') else: print('Не палиндром')
Однако эта программа менее эффективная, так как в цикле перебираются все символы строки. В предыдущем варианте цикл завершается сразу, как становилось ясно, что строка палиндромом не является.
Вместо цикла, перебирающего символы строки и добавляющего их в новую, из всей строки можно взять срез с отрицательным шагом. В этом случае в новой строке символы будут идти в обратном порядке по сравнению с исходной.
s2 = s[::-1]
Пользуясь возможностями языка Python, можно найти и другие способы решения задачи. Например, если передать строку в функцию reversed, из нее будет возвращен объект-итератор, генерирующий символы строки в обратном порядке. Если передать этот объект в строковый метод join, он проитерирует его и объединит символы в строку.
s = input() s2 = ''.join(reversed(s)) print(s == s2) # True - если палиндром, False - если нет.