Как показано в примере выше — анаграмма — это два слова с одинаковым количеством символов, независимо от того, как они переставлены. Вот цель и подход к алгоритму, который нам нужно сделать:

- ЦЕЛЬ -

Возьмите два слова и верните ИСТИНА или ЛОЖЬ в зависимости от того, являются ли они анаграммами.

- ПОДХОД -

  1. Разбейте слова на отдельные символы
  2. Запишите частоту символов
  3. Сравните количество символов

В принципе, если количество символов точно такое же, у нас есть совпадение.

- НЕПРАВИЛЬНАЯ ИДЕЯ -

Первое, о чем я подумал, это просто создать два объекта с символами в качестве ключей и частотой в качестве значений, а затем сравнить два объекта на наличие различий.

Проблема (как блестяще объяснено в этой статье) заключается в том, что примитивы JavaScript, такие как строки и числа, сравниваются по VALUE, в то время как не-примитивы, такие как объекты, массивы и даты сравниваются по ССЫЛКЕ, т. е. по одному и тому же местоположению в памяти.

Поэтому, когда я попытался сравнить объекты, не было простого способа сделать это. Базовый оператор сравнения == всегда будет возвращать false. Можно ли это сделать? Да. Было ли это уродливым и длинным, и мне хотелось плакать? Тоже да. Ниже приведен пример:

Кредит на http://adripofjavascript.com/blog/drips/object-equality-in-javascript.html

- ПРАВИЛЬНАЯ ИДЕЯ -

Гораздо проще будет подсчитать символы первого слова, а затем вычесть символы второго слова. То, что у вас осталось, это объект, который должен иметь все нули для значений. Если их нет — мы знаем, что у нас нет анаграммы. Вот диаграмма, чтобы визуализировать это:

- ВРЕМЯ КОДИТЬ -

Начнем с подсчета символов первого слова с помощью небольшого цикла for-of. (Либо инициализировать персонажа, если он еще не существует, либо добавить к его счету)

Из такого слова, как «abbc», мы получим:

{
  a: 1, 
  b: 2, 
  c: 1,
}

Следующий шаг — взять второе слово и вычесть его символы из первого. Если какой-либо символ не существует, мы завершаем весь алгоритм и возвращаем FALSE.

Последний шаг — проверка, все ли обнулено. Если они не все нули — у нас нет двух слов, являющихся анаграммами.

Если мы дошли до этого момента, объекты считаются эквивалентными, и в конце мы возвращаем TRUE. Вот окончательный код:

И это, это. Надеюсь, вы нашли эту разбивку полезной. ✌