← Назад к вопросам

Проверка на палиндром

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) с ранним выходом
  • Пространственная сложность оптимизированного варианта минимальна
Проверка на палиндром | PrepBro