@Kipsi

Как написать функцию анаграмму?

Здравствуйте. Подскажите как написать функцию которая берет какой то массив из разных слов [кот,стол,стук,ток,мир,молот,слот,рим] и тд. и разбивает слова по парам если получается анаграмма или выкидывает из массива слова которые не имеют пар. Я пробовала делать проверку каждого слова по порядку с каждым из массива на наличие всех одинаковых букв в словах и при совпадении объединять их в пары, а те слова которым не нашлось пар удалять, но что то похоже пошло не так.
  • Вопрос задан
  • 118 просмотров
Пригласить эксперта
Ответы на вопрос 2
hzzzzl
@hzzzzl
ar = ['кот','стол','стук','ток','мир','молот','слот','рим'] 
sorted = ar.map(w => w.split('').sort().join(''))
pairs = []

sorted.forEach((w, i) => {

	sorted.forEach((ww, ii) => {
		if(w === ww && i !== ii) {
			pairs.push([ar[i], ar[ii]])
        }
    })

})

ar = ar.filter(w => !pairs.flat().includes(w))

console.log(pairs, ar)
Ответ написан
Комментировать
Ответ зависит от количества слов. Если их, например, около 100, то вышеназванный метод сгодится. Если их миллион, тогда надо что-то придумывать. Например, как вариант: пишем в таблицу базы данных (words) само слово и произведение M численных значений его букв. Сортируем по М, группируя по М.
Select * from words group by M order by M
Получаются списки слов, которые с большой вероятностью будут анаграммами. Каждый список нужно проверять отдельно, например, по методу hzzzzi, т.к. могут существовать группы совершенно разных чисел, дающих одинаковые произведения. Но их будет уже несравненно меньше.
Все это имеет смысл, конечно, только для действительно большого числа слов.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы