#python-3.x #string #filter #palindrome
#python-3.x #строка #Фильтр #палиндром
Вопрос:
Я пытаюсь создать функцию, которая проверяет, является ли строка палиндромом. Он должен учитывать только буквенно-цифровые символы, включая пробелы. Я в основном должен кодировать то, что приведено ниже, без каких-либо методов в строке (поэтому нет isalnum() , lower() и т. Д.), И не добавлять дополнительные структуры данных (поэтому без y /’ ‘). Я не могу придумать способ добиться этого. Возможно ли это? Функция должна учитывать символы верхнего регистра, равные их частям счетчика в нижнем регистре
def isPalindrome_py(x):
y = ''
for i in range(len(x)):
if x[i] == ' ':
pass
elif x[i].isalnum():
y = x[i]
y = y.lower()
if y[::-1] == y:
return True
else:
return False
Редактировать:
в качестве примера — isPalindrome_py(«#RaCe CaR $!») Должен возвращать True
Комментарии:
1. Почему нельзя использовать какой-либо строковый метод, подобный
isalnum()
встроенным в Python?2. Это ограничение
Ответ №1:
def isPal(x):
if len(x) < 2:
return True
elif not ('0' <= x[0] <= '9' or 'A' <= x[0] <= 'Z' or 'a' <= x[0] <= 'z'):
return isPal(x[1:])
elif not ('0' <= x[-1] <= '9' or 'A' <= x[-1] <= 'Z' or 'a' <= x[-1] <= 'z'):
return isPal(x[:-1])
elif x[0] != x[-1] and x[0] >= 'A' and x[-1] >= 'A' and ord(x[0]) 32 != ord(x[-1]) and ord(x[0]) - 32 != ord(x[-1]):
return False
else:
return isPal(x[1:-1])
Теперь давайте распакуем этого монстра
Эта функция работает, пытаясь найти символы, которые подразумевали бы, что строка не является палиндромом, и, если она не может найти никаких нарушений, делает вывод, что строка должна быть палиндромом.
Первое предложение проверяет, является ли строка тривиально палиндромом (поскольку все одиночные символы и пустая строка являются палиндромами)
Второе предложение ( elif not ('0' <= x[0]
…) проверяет, является ли первый символ в строке буквенно-цифровым. Если это не так, то это игнорируется.
Третье предложение делает то же самое, но для последнего символа в строке.
Четвертое предложение проверяет, совпадает ли первый символ в строке с последним символом в строке. В нем используется тот факт, что прописные и строчные буквы удалены друг от друга на 32 в ASCII.