Проверьте, что строка — палиндром, игнорируя регистр и не-буквы
Реализуйте isPalindrome(s), возвращающую true, если s читается одинаково в обе стороны. Требования: игнорируйте регистр букв и пропускайте все не-буквенно-цифровые символы (пробелы, пунктуацию). Корректно обработайте многобайтовый UTF-8 (работайте по рунам, а не сырым байтам). O(n) по времени.
func isPalindrome(s string) bool {
// ваш код здесь
return false
}
Допишите реализацию.
Приведите строку к нижнему регистру и преобразуйте в []rune, затем два указателя идут навстречу: пропускайте не-буквы и не-цифры через unicode.IsLetter/IsDigit, сравнивайте r[i] != r[j] → false, и сдвигайте оба. Если они пересеклись — это палиндром. O(n) по времени, O(n) по памяти на срез рун.
- ✗Сравнивать байты через
s[i]вместо рун, неверно обрабатывая многобайтовый ввод - ✗Фильтровать только буквы, отбрасывая цифры, которые должны учитываться
- ✗Считать, что
==строк игнорирует регистр и пунктуацию
- →Почему подход с байтовыми индексами ломается на строке с многобайтовыми рунами?
- →Как сделать это за O(1) доп. памяти без преобразования в
[]rune?
Задача
Проверить, является ли строка палиндромом, игнорируя регистр и не-буквенно-цифровые символы.
func isPalindrome(s string) bool {
r := []rune(strings.ToLower(s))
i, j := 0, len(r)-1
for i < j {
for i < j && !unicode.IsLetter(r[i]) && !unicode.IsDigit(r[i]) {
i++
}
for i < j && !unicode.IsLetter(r[j]) && !unicode.IsDigit(r[j]) {
j--
}
if r[i] != r[j] {
return false
}
i, j = i+1, j-1
}
return true
}
Как это работает
strings.ToLower убирает регистр, []rune даёт корректную работу с многобайтовыми символами. Два указателя i и j идут навстречу:
- внутренние циклы пропускают всё, что не буква и не цифра (
unicode.IsLetter/IsDigit), — так игнорируются пробелы и пунктуация; - если значимые символы по краям различаются (
r[i] != r[j]) — это не палиндром; - иначе сдвигаем оба указателя внутрь.
Когда указатели пересеклись без расхождений — строка палиндром. O(n) по времени, O(n) по памяти на срез рун.
⚠️ Проверяет технику двух указателей плюс работу с рунами и санитизацию ввода.