как отфильтровать строку без использования каких-либо дополнительных структур данных (без дополнительных строк, списков и т. Д.) Или каких-либо строковых методов?

#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.