Здесь уже есть несколько хороших ответов, и я думаю, что три - это, вероятно, правильный путь, но это интересная проблема, поэтому я добавлю в свои два цента ...
Наивным подходом будет генерирование всех перестановок доступных букв и всех различных подмножеств, а затем поиск каждого потенциального слова в словаре. Проблема заключается в том, что, хотя это не сложно сделать, существует на удивление большое количество потенциальных слов, и большинство из них являются недействительными.
С другой стороны, проверка словаря может быть ускорена бинарным поиском или чем-то подобным. С другой стороны, вы будете делать это так много раз, что программа остановится для длинных списков букв.
Нам определенно нужно предварительно обработать словарь, чтобы сделать его более полезным, и нам действительно нужен способ быстро исключить большинство потенциальных совпадений, даже если метод иногда дает ложные срабатывания.
Один из способов сделать это - представить, какие буквы слово использует в битовой карте. Другими словами, предварительно рассчитайте 32-битное число для каждого слова в словаре, где каждый бит устанавливается, если соответствующая буква алфавита используется в слове хотя бы один раз. Это позволит вам найти все потенциальные слова, выполнив линейное сканирование словаря и сохранив только те, которые используют только те буквы, которые у вас есть. Я подозреваю, что при некоторой сообразительности и индексации вы можете добиться большего успеха, чем линейный.
Из кандидатов, которых вы найдете, некоторым потребуется больше экземпляров письма, чем у вас имеется, поэтому это будут ложные срабатывания. Это означает, что вам необходимо выполнить окончательную проверку всех кандидатов, сгенерированных вами, чтобы исключить почти попадания. Есть много способов сделать это, но один из самых простых - просмотреть список букв и заменить первое вхождение этой буквы в потенциальном слове тире. Когда вы закончите, если у потенциального слова есть что-то кроме черточек, это провал. Более элегантным решением, хотя и не обязательно более быстрым, было бы создание массива буквенных частот и сравнение их.
Опять же, я думаю, что попытки - это, вероятно, путь, но я надеюсь, что эти идеи полезны для вас.
редактировать
Позвольте мне привести пример того, как вы могли бы добиться большего успеха, чем полный линейный поиск при первоначальном поиске: использовать основание. Держите простой индекс, который позволяет вам искать первое слово, которое начинается с данной буквы. Затем, выполняя поиск, пропустите все слова, начинающиеся с буквы, которой у вас нет. Это не гигантское ускорение, но улучшение.