← Назад к вопросам
Проверка на палиндром
1.2 Junior🔥 131 комментариев
#Алгоритмы и структуры данных
Условие
Напишите функцию isPalindrome(str), которая проверяет, является ли строка палиндромом. Функция должна игнорировать пробелы, знаки препинания и регистр букв:
function isPalindrome(str) {
// Ваш код
}
// Примеры:
console.log(isPalindrome("racecar")); // true
console.log(isPalindrome("A man a plan a canal Panama")); // true
console.log(isPalindrome("hello")); // false
console.log(isPalindrome("Was it a car or a cat I saw?")); // true
Что проверяется
- Работа со строками
- Регулярные выражения
- Алгоритмы на строках
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Решение
Палиндром — это строка, которая читается одинаково в обе стороны. Решу эту задачу пошагово, рассмотрев несколько подходов.
Основной подход с регулярными выражениями
function isPalindrome(str: string): boolean {
// Очищаем строку: удаляем всё кроме букв и цифр, переводим в нижний регистр
const cleaned = str.replace(/[^a-z0-9]/gi, "").toLowerCase();
// Проверяем, равна ли строка её зеркальному отражению
return cleaned === cleaned.split("").reverse().join("");
}
Объяснение:
replace(/[^a-z0-9]/gi, "")— регулярное выражение удаляет всё кроме букв (a-z) и цифр (0-9), флагiдля игнорирования регистра,gдля глобального поиска.toLowerCase()— приводим к нижнему регистру.split("")— разбиваем на массив символов.reverse()— разворачиваем массив.join("")— объединяем обратно в строку- Сравниваем исходную очищенную строку с её зеркальным отражением
Оптимизированный подход с двумя указателями
function isPalindrome(str: string): boolean {
const cleaned = str.replace(/[^a-z0-9]/gi, "").toLowerCase();
let left = 0;
let right = cleaned.length - 1;
while (left < right) {
if (cleaned[left] !== cleaned[right]) {
return false;
}
left++;
right--;
}
return true;
}
Преимущества этого подхода:
- Временная сложность: O(n)
- Пространственная сложность: O(n) на очистку, но не создаём массив обратного порядка
- Ранний выход при нахождении несовпадения
- Более читаемый для больших строк
Проверка на производительность
Для очень больших строк можно оптимизировать, не создавая промежуточную очищенную строку:
function isPalindrome(str: string): boolean {
let left = 0;
let right = str.length - 1;
while (left < right) {
// Пропускаем недопустимые символы слева
while (left < right && !/[a-z0-9]/i.test(str[left])) {
left++;
}
// Пропускаем недопустимые символы справа
while (left < right && !/[a-z0-9]/i.test(str[right])) {
right--;
}
// Сравниваем символы в нижнем регистре
if (str[left].toLowerCase() !== str[right].toLowerCase()) {
return false;
}
left++;
right--;
}
return true;
}
Тестирование
console.log(isPalindrome("racecar")); // true
console.log(isPalindrome("A man a plan a canal Panama")); // true
console.log(isPalindrome("hello")); // false
console.log(isPalindrome("Was it a car or a cat I saw?")); // true
console.log(isPalindrome("")); // true (пустая строка)
console.log(isPalindrome("a")); // true (один символ)
console.log(isPalindrome("12321")); // true
console.log(isPalindrome("12345")); // false
Выбор подхода
Для интервью рекомендую второй подход (двухуказательный) — он показывает понимание алгоритмов, хорошую производительность и читаемость. Первый подход проще в написании, но создаёт лишние структуры данных.
Ключевые моменты:
- Регулярное выражение
[^a-z0-9]удаляет всё кроме букв и цифр - Флаг
iв регексе игнорирует регистр - Два указателя сходятся из краёв к центру за O(n) с ранним выходом
- Пространственная сложность оптимизированного варианта минимальна