Оставьте только буквы и цифры, приведите их к одному регистру и сравните символы с двух концов. Для Unicode используйте rune, а не байты.
Напишите функцию на Go, которая проверяет, является ли заданная строка палиндромом. Функция должна игнорировать регистр и пробелы. Кроме того, специальные символы также должны игнорироваться. Например, строка "A man, a plan, a canal: Panama" должна считаться палиндромом.
Оставьте только буквы и цифры, приведите их к одному регистру и сравните символы с двух концов. Для Unicode используйте rune, а не байты.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Оставьте только буквы и цифры, приведите их к одному регистру и сравните символы с двух концов. Для Unicode используйте rune, а не байты.
Вариант на Go с простым приведением Unicode к нижнему регистру:
import "unicode"
func isPalindrome(s string) bool {
normalized := make([]rune, 0, len(s))
for _, r := range s {
if unicode.IsLetter(r) || unicode.IsDigit(r) {
normalized = append(normalized, unicode.ToLower(r))
}
}
for i, j := 0, len(normalized)-1; i < j; i, j = i+1, j-1 {
if normalized[i] != normalized[j] { return false }
}
return true
}
Пустая после фильтрации строка считается палиндромом. Время и дополнительная память O(n). Полное Unicode case folding и нормализация составных символов здесь не выполняются; для заданного латинского примера результат true.