Палиндром ли строка

Вводится строка. Определить, является ли она палиндромом, и вывести соответствующее сообщение. Палиндромом называется слово или фраза, которые читаются одинаково справа налево и слева направо.

Палиндром ли строка. Решение задачи на языке Python
#
×

Решение задачи на языке программирования 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 - если нет.