Как показано в примере выше — анаграмма — это два слова с одинаковым количеством символов, независимо от того, как они переставлены. Вот цель и подход к алгоритму, который нам нужно сделать:
- ЦЕЛЬ -
Возьмите два слова и верните ИСТИНА или ЛОЖЬ в зависимости от того, являются ли они анаграммами.
- ПОДХОД -
- Разбейте слова на отдельные символы
- Запишите частоту символов
- Сравните количество символов
В принципе, если количество символов точно такое же, у нас есть совпадение.
- НЕПРАВИЛЬНАЯ ИДЕЯ -
Первое, о чем я подумал, это просто создать два объекта с символами в качестве ключей и частотой в качестве значений, а затем сравнить два объекта на наличие различий.
Проблема (как блестяще объяснено в этой статье) заключается в том, что примитивы JavaScript, такие как строки и числа, сравниваются по VALUE, в то время как не-примитивы, такие как объекты, массивы и даты сравниваются по ССЫЛКЕ, т. е. по одному и тому же местоположению в памяти.
Поэтому, когда я попытался сравнить объекты, не было простого способа сделать это. Базовый оператор сравнения == всегда будет возвращать false. Можно ли это сделать? Да. Было ли это уродливым и длинным, и мне хотелось плакать? Тоже да. Ниже приведен пример:
Кредит на http://adripofjavascript.com/blog/drips/object-equality-in-javascript.html
- ПРАВИЛЬНАЯ ИДЕЯ -
Гораздо проще будет подсчитать символы первого слова, а затем вычесть символы второго слова. То, что у вас осталось, это объект, который должен иметь все нули для значений. Если их нет — мы знаем, что у нас нет анаграммы. Вот диаграмма, чтобы визуализировать это:
- ВРЕМЯ КОДИТЬ -
Начнем с подсчета символов первого слова с помощью небольшого цикла for-of. (Либо инициализировать персонажа, если он еще не существует, либо добавить к его счету)
Из такого слова, как «abbc», мы получим:
{ a: 1, b: 2, c: 1, }
Следующий шаг — взять второе слово и вычесть его символы из первого. Если какой-либо символ не существует, мы завершаем весь алгоритм и возвращаем FALSE.
Последний шаг — проверка, все ли обнулено. Если они не все нули — у нас нет двух слов, являющихся анаграммами.
Если мы дошли до этого момента, объекты считаются эквивалентными, и в конце мы возвращаем TRUE. Вот окончательный код:
И это, это. Надеюсь, вы нашли эту разбивку полезной. ✌