Я сделал нечто похожее для решения кроссвордов много лун назад. Я в основном взял файл словаря и изменил его так, чтобы он выглядел так:
aardvark:aaadkrr
albatross:aablorsst
Тогда для заданного набора букв я мог бы просто отсортировать их и использовать что-то вроде:
grep ':{sorted letters}$' mywords.txt | sed 's/:.*$//'
и это дало бы мне слова-кандидаты.
Вам придётся обернуть код перестановки / комбинации, если вы ищете слова, которые могут использовать меньше, чем полный набор, но приведенный алгоритм был очень эффективным.
Для Java я бы рассмотрел либо сохранение хеш-таблицы в памяти (при условии, что у вас есть место), либо использование внешней базы данных, где ключи поиска являются отсортированными вариациями, что, конечно, допускает дублирование, поскольку pore
и rope
оба пришли бы из eorp
.
Хотя мое решение на основе grep
было вполне подходящим для моих собственных целей, вы, вероятно, не хотите полагаться на внешние инструменты и подпроцессы в надежном приложении.