Если вы заранее знаете полный словарь и он не меняется между поисками, вы можете попробовать следующее ...
Индекс словаря. Каждое слово (например, «привет») становится кортежем (ключ, данные), таким как («ehllo», «привет»). В ключе буквы отсортированы в алфавитном порядке.
Хорошие структуры данных индекса будут включать trie (он же цифровое дерево) или троичное дерево . Обычное двоичное дерево можно заставить работать. Хэш-таблица не будет работать. Я собираюсь взять дерево или тройное дерево. Примечание. Структура данных должна действовать как мультикарта (вам, вероятно, нужен связанный список сопоставленных элементов данных на каждом листе с сопоставлением ключей).
Прежде чем оценивать конкретную строку, отсортируйте буквы в строке. Затем выполните поиск ключа в структуре данных. НО простой поиск по ключу найдет только слова, которые используют все буквы из исходной строки.
По сути, поиск по дереву совпадает с одной буквой за раз, выбирая дочерний узел на основе следующей буквы ввода. Однако на каждом шаге у нас есть дополнительная опция - пропустить букву отсортированной входной строки и остаться на том же узле (т. Е. Не использовать эту букву в выходных данных). Очевидная вещь, которую нужно сделать - это поиск в глубину в обратном направлении. Обратите внимание, что и наши ключи, и наш ввод имеют отсортированные буквы, поэтому мы, вероятно, можем немного оптимизировать поиск.
Версия троичного дерева следует принципам, подобным древовидной, но вместо нескольких дочерних элементов на узел, в структуру встроена логика бинарного дерева следующей буквы. Поиск может быть легко адаптирован - параметры для каждого поиска следующей буквы соответствуют следующей вводимой букве или отбрасывают ее.
Когда вы получаете серии одинаковых букв в отсортированной входной строке, опция «пропустить букву» в поиске должна быть «перейти к следующей другой букве». В противном случае вы в конечном итоге делаете повторяющиеся поиски (во время обратного отслеживания) - например, Есть 3 различных способа использования двух из трех дубликатов букв - вы можете игнорировать первый, второй или третий дубликат - и вам нужно проверить только один регистр.
Оптимизация может содержать дополнительные детали в узлах структуры данных, чтобы помочь сократить дерево поиска. Например. сохраняя максимальную длину хвостов слов в поддереве, вы можете проверить, содержит ли оставшаяся часть строки поиска достаточное количество букв для продолжения поиска.
Сложность времени не сразу очевидна из-за возврата.