Найди анаграммы
Анаграммы — слова, которые получаются при перестановке букв или звуков местами в исходном слове. Например, апельсин и спаниель, старорежимность и нерасторжимость, равновесие и своенравие. Подробнее об анаграммах можно узнать в этой статье в Википедии.
Напишите функцию isAnagram
, которая будет проверять являются ли два переданных ей слова анаграммами.
Функция может работать с несколькими словами и не учитывает регистр букв:
Больше примеров анаграммов можно найти здесь.
Решение
При решении задачи стоит руководствоваться всего двумя правилами:
- Пробелы не учитываются, то есть
Statue of Liberty
иBuilt to stay free
будут считаться анаграммами. - Одинаковые слова не являются анаграммами, то есть
апельсин
иапельсин
не являются анаграммами.
Функция isAnagram
принимает две строки назовём их условно original
и test
, хотя на самом деле особой разницы между ними нет. В соответствии со вторым правилом, первое, что необходимо сделать — проверить не были ли переданы в функцию одинаковые строки:
Метод строк String.prototype.trim()
(MDN) в данном случае необходим для того, чтобы убрать все whitespace символы (пробелы, табуляцию, переносы строк) из начала и конца передаваемых в функцию строк original
и test
. Таким образом, в результате операции ' this is string'.trim() === 'this is string '.trim()
обе строки будут содержать одинаковые символы 'this is string'
и, следовательно, результатом выражения будет true
.
Если переданные в функцию строки не одинаковые, то можно начинать проверку на анаграммы. Первое, что нужно сделать — удалить все пробельные символы из строки.
Удаление пробельных символов с помощью регулярных выражений
Регулярное выражение \s+
находит все whitespace символы в строке. Их остаётся только заменить на пустую строку с помощью метода String.prototype.replace()
(MDN).
Удаление пробельных символов с помощью map и trim
Данный способ гораздо менее элегантный, чем предыдущий. Тем не менее, он работает, и вы скорее всего захотите его использовать, если всё ещё не научились исползовать регулярные выражения на должном уровне.
Суть способа заключается в следующем: строка разбивается на отдельные символы с помощью метода String.prototype.split()
(MDN), после чего каждый символ перебирается с помощью метода массивов Array.prototype.map()
(MDN). На каждый символ в строке применяется метод String.prototype.trim()
(MDN), который удаляет все пробельные символы из строки. После завершения данной операции строку необходимо собрать обратно с помощью метода Array.prototype.join()
(MDN).
Сортировка строки
Самый простой способ узнать совпадают ли строки — отсортировать их символы с помощью одного алгоритма. Сделать это можно с помощью метода массивов Array.prototype.sort()
(MDN). Как именно они будут отсортированы? Неважно. Главное, что можно быть точно уверенным, что отсортированы они будут одинаково. Таким образом, всё что осталось сделать — сравнить отсортированные строки:
Подобные действия необходимо совершить для обеих строк, поэтому необходимо создать соответствующую функцию (в соответствии с принципом DRY):
Комментарии