Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про JavaScript: anagram, comparison, frequency, map

Какой подход использовать для сравнения анаграмм в строках?

Вопрос нужен, чтобы оценить, понимает ли кандидат разные стратегии сравнения анаграмм и их алгоритмические компромиссы.

Короткий ответ

Основной подход для сравнения анаграмм — сравнение частот символов. Если частоты всех символов совпадают, строки являются анаграммами. Сортировка строк возможна, но менее эффективна. Для задач с большими объёмами данных предпочтителен подход с частотными таблицами и линейной сложностью.

Длинный ответ

Анаграммность определяется не порядком символов, а их количеством. Из этого следует несколько возможных подходов, каждый со своими плюсами и минусами.

Наивный подход: сортировка строк

Идея проста:

  • привести обе строки к массиву символов

  • отсортировать

  • сравнить результат

const isAnagram = (a, b) =>
  a.split('').sort().join('') === b.split('').sort().join('')

Проблемы подхода:

  • сортировка имеет сложность O(n log n)

  • лишние аллокации памяти

  • плохо масштабируется для частых проверок

Используется в основном:

  • в учебных примерах

  • при очень коротких строках

Основной подход: частотные таблицы

Более правильная и масштабируемая стратегия — считать частоты символов.

Общая идея:

  • для первой строки увеличить счётчики символов

  • для второй строки уменьшить их

  • в конце все счётчики должны быть равны нулю

function isAnagram(a, b) {
  if (a.length !== b.length) return false

  const map = {}

  for (const ch of a) map[ch] = (map[ch] || 0) + 1
  for (const ch of b) {
    if (!map[ch]) return false
    map[ch]--
  }

  return true
}

Преимущества:

  • линейная сложность O(n)

  • не зависит от порядка символов

  • хорошо подходит для sliding window

Оптимизации для ограниченного алфавита

Если алфавит известен и ограничен (например, только a–z):

  • можно использовать массив фиксированной длины

  • это быстрее и экономичнее по памяти

const freq = new Array(26).fill(0)

Подход со счётчиком совпадений

Для задач поиска анаграмм в строке часто используют:

  • общий счётчик совпавших символов

  • уменьшение/увеличение его при сдвиге окна

Это позволяет:

  • не сравнивать таблицы целиком

  • получить строго линейное время

Что важно учитывать на практике

  1. Длина строк

    • разная длина → не анаграммы сразу

  2. Набор символов

    • регистр

    • пробелы

    • специальные символы

  3. Частота проверок

    • единичная проверка

    • массовый поиск в строке

Какой подход выбирать

  • одиночная проверка, короткие строки → допустима сортировка

  • частые проверки или поиск в тексте → частотные таблицы

  • большие объёмы данных → массивы + sliding window

Краткий вывод

На практике анаграммы сравнивают через частоты символов, а не сортировку. Это даёт линейную сложность, хорошо масштабируется и легко применяется в задачах поиска и сканирования строк.

Уровень

  • Рейтинг:

    4

  • Сложность:

    6

Навыки

  • JavaScript

    JavaScript

Ключевые слова

#anagram

#comparison

#frequency

#map

Подпишись на React Developer в телеграм