Sobes.tech
Middle

""" Schreiben Sie eine Funktion, die bestimmt, ob die übergebene Zeichenkette ein Palindrom ist (liest sich von links nach rechts und von rechts nach links gleich). Beispiele für Palindrome: - Kazak - A rosa cayó na pata de Azor - Do geese see God? - Madam, I'm Adam Speicherbegrenzung O(1). """

sobes.tech KI

Antwort von AI

Для проверки, является ли строка палиндромом с ограничением по памяти O(1), можно использовать два указателя — один с начала строки, другой с конца, и двигать их навстречу друг другу, сравнивая символы.

При этом нужно игнорировать пробелы, знаки препинания и регистр.

Пример на Go:

import (
    "unicode"
    "strings"
)

func isPalindrome(s string) bool {
    left, right := 0, len(s)-1

    for left < right {
        // Пропускаем не буквенно-цифровые символы слева
        for left < right && !unicode.IsLetter(rune(s[left])) && !unicode.IsDigit(rune(s[left])) {
            left++
        }
        // Пропускаем не буквенно-цифровые символы справа
        for left < right && !unicode.IsLetter(rune(s[right])) && !unicode.IsDigit(rune(s[right])) {
            right--
        }

        if left < right {
            if unicode.ToLower(rune(s[left])) != unicode.ToLower(rune(s[right])) {
                return false
            }
            left++
            right--
        }
    }
    return true
}

// Пример использования:
// fmt.Println(isPalindrome("А роза упала на лапу Азора")) // true

Такой подход не требует дополнительной памяти, кроме нескольких переменных, и работает за O(n) по времени.