🟨 JavaScript
Средняя
🕐 15 мин

Функция проверки на палиндром

Цель: создать функцию palindrome(str), которая возвращает нормализованную строку, если она палиндром; иначе — null.

💡 Подсказка решения
  1. Приведите строку к нижнему регистру.
  2. Удалите все символы, кроме букв и цифр.
  3. Сравните нормализованную строку с её разворотом.
👀 Решение #1 (через разворот строки)
/**
 * Функция проверки строки на палиндром
 * Палиндром - строка, которая читается одинаково в обоих направлениях.
 * Функция нормализует строку, удаляя все не-буквенно-цифровые символы,
 * приводит к нижнему регистру, затем проверяет на совпадение с обратной версией.
 * 
 * @param {string} str - Входная строка для проверки
 * @returns {string|null} Нормализованную строку-палиндром или null, если строка не палиндром
 */
function palindrome(str) {
  // Создаем нормализованную версию строки:
  const cleaned = str
    // Приводим все символы к нижнему регистру для регистронезависимого сравнения
    .toLowerCase()
    // Удаляем все символы, кроме:
    // - цифр (0-9)
    // - латинских букв (a-z)
    // - русских букв (а-я, включая букву ё)
    // Флаг 'gi' означает:
    // g - глобальный поиск (всей строки)
    // i - игнорирование регистра
    .replace(/[^0-9a-zа-яё]/gi, '');
 
  // Проверяем, является ли строка палиндромом:
  // 1. Разбиваем строку на массив символов (split(''))
  // 2. Разворачиваем массив (reverse())
  // 3. Собираем обратно в строку (join(''))
  // 4. Сравниваем с оригинальной нормализованной строкой
  return cleaned === cleaned.split('').reverse().join('') 
    ? cleaned    // Если палиндром - возвращаем нормализованную строку
    : null;     // Если не палиндром - возвращаем null
}

Почему именно так:

  • Коротко и наглядно.
  • Возвращает то, что требуется тестом: валидную нормализованную строку или null.
👀 Решение #2 (два указателя)
/**
 * Функция проверки строки на палиндром с оптимизированным алгоритмом
 * Проверяет, читается ли строка одинаково в обоих направлениях,
 * используя алгоритм двух указателей для эффективной проверки.
 * 
 * @param {string} str - Входная строка для проверки
 * @returns {string|null} Нормализованную строку без спецсимволов в нижнем регистре,
 *                       если строка является палиндромом, иначе null
 */
function palindrome(str) {
  // 1. Нормализация входной строки:
  const cleaned = str
    // Приведение к нижнему регистру для регистронезависимого сравнения
    .toLowerCase()
    // Удаление всех не-буквенно-цифровых символов:
    // - сохраняем цифры (0-9)
    // - латинские буквы (a-z)
    // - русские буквы (а-яё)
    // Флаги:
    // g - глобальный поиск по всей строке
    // i - игнорирование регистра (хотя toLowerCase уже применен)
    .replace(/[^0-9a-zа-яё]/gi, '');
 
  // 2. Алгоритм двух указателей для проверки палиндрома:
  let left = 0;                    // Левый указатель (начало строки)
  let right = cleaned.length - 1;  // Правый указатель (конец строки)
 
  // Пока указатели не встретились в середине
  while (left < right) {
    // Сравниваем символы на позициях указателей
    if (cleaned[left] !== cleaned[right]) {
      return null;  // Не совпадает - не палиндром
    }
    // Сдвигаем указатели к центру
    left++;
    right--;
  }
 
  // 3. Если все символы совпали - возвращаем нормализованную строку
  return cleaned;
}

Почему именно так:

  • Без создания промежуточной реверс‑строки.
  • Линейно по времени и памяти.

Описание задачи

Напишите функцию palindrome, которая возвращает нормализованную строку, если входная строка является палиндромом, и null — если нет. Нормализация: нижний регистр, удаление неалфанумерических символов.

Примеры использования

palindrome('level'); // 'level'
palindrome('RaceCar'); // 'racecar'
palindrome('A man, a plan, a canal: Panama!'); // 'amanaplanacanalpanama'
palindrome('hello'); // null

Требования

  • Функция должна называться palindrome
  • Возвращать нормализованную строку или null
  • Игнорировать регистр, пробелы и пунктуацию
  • Корректно работать с пустой строкой

🧑‍💻 Это не баг! Это фича!

Редактор кода намеренно скрыт на мобильном.

Поверь, так лучше: я оберегаю тебя от искушения писать код в неидеальных условиях. Маленький экран и виртуальная клавиатура — не лучшие помощники для программиста.

📖 Сейчас: Изучи задачу, продумай решение. Действуй как стратег.

💻 Потом: Сядь за компьютер, открой сайт и реализуй все идеи с комфортом. Действуй как код-джедай!