Определение анаграммности двух строк без учёта регистра и знаков препинания

Нормализуйте регистр, оставьте только Unicode-буквы и цифры, затем сравните частоты символов. Порядок не важен, но число повторений каждой буквы должно совпадать.

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

Что ответить на собеседовании

Нормализуйте регистр, оставьте только Unicode-буквы и цифры, затем сравните частоты символов. Порядок не важен, но число повторений каждой буквы должно совпадать.

Подробный разбор

Ответ с пояснениями

Условие

Реализуйте функцию, которая принимает две строки и возвращает, являются ли они анаграммами. При проверке регистр символов игнорируется, а в сравнение включаются только буквенно-цифровые символы: пробелы, знаки препинания и прочие небуквенные символы следует исключить.

Ответ

Нормализуйте регистр, оставьте только Unicode-буквы и цифры, затем сравните частоты символов. Порядок не важен, но число повторений каждой буквы должно совпадать.

function isAnagram(first, second) {
  const normalize = text => Array.from(text.normalize('NFC').toLowerCase().replace(/[^\p{L}\p{N}]/gu, ''));
  const a = normalize(first), b = normalize(second);
  if (a.length !== b.length) return false;
  const counts = new Map();
  for (const char of a) counts.set(char, (counts.get(char) ?? 0) + 1);
  for (const char of b) {
    const count = counts.get(char) ?? 0;
    if (count === 0) return false;
    counts.set(char, count - 1);
  }
  return true;
}

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

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее