Используйте два индекса: пропускайте незначимые символы с краёв и сравнивайте буквы в одинаковом регистре. Новая нормализованная строка не нужна.
Функция определения палиндромности строки
Используйте два индекса: пропускайте незначимые символы с краёв и сравнивайте буквы в одинаковом регистре. Новая нормализованная строка не нужна.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Создайте функцию, которая проверяет, является ли переданная строка палиндромом — т.е. читается одинаково слева направо и справа налево, при этом не учитывая регистр, пробелы и знаки пунктуации.
Примеры строк‑палиндромов:
- Казак
- А роза упала на лапу Азора
- Do geese see God?
- Madam, I’m Adam
Дополнительное требование: использовать лишь постоянный объём дополнительной памяти — O(1).
Ответ
Используйте два индекса: пропускайте незначимые символы с краёв и сравнивайте буквы в одинаковом регистре. Новая нормализованная строка не нужна.
Для латиницы, кириллицы и цифр из примеров:
function isPalindrome(text) {
const significant = char => /[a-zа-яё0-9]/i.test(char);
let left = 0, right = text.length - 1;
while (left < right) {
while (left < right && !significant(text[left])) left++;
while (left < right && !significant(text[right])) right--;
if (text[left].toLowerCase() !== text[right].toLowerCase()) return false;
left++; right--;
}
return true;
}
Время O(n), вспомогательная память O(1). Полная Unicode-нормализация и составные графемы требуют расширения контракта; здесь явно ограниченный алфавит. Пустая или полностью игнорируемая строка считается палиндромом.