Middle
""" Napisz funkcję, która określa, czy przekazany ciąg znaków jest palindromem (czytany od lewej do prawej i od prawej do lewej w ten sam sposób). Przykłady palindromów: - Kazak - A rosa упала na лапу Азора - Do geese see God? - Madam, I'm Adam Ograniczenie pamięci O(1). """
sobes.tech AI
Odpowiedź od 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) по времени.