Вот подсказка, чтобы вы начали на правильном пути: не даже рассматривать с помощью std::next_permutation
, если это не то, что вы будете только когда-либо использовать один или два раза (и, возможно, даже не то, потому что это на самом деле более сложная чем выполнение права на работу).
Используя std::next_permutation
, ваша функция будет приблизительно N! раз медленнее, чем необходимо - в случае 5 букв, которые будут в 120 раз медленнее, и если вы когда-нибудь будете использовать более длинные слова, это будет очень быстро очень быстро (например, для 10 букв это более 3,5 млн).
Вместо этого начните с предварительной обработки словаря. Вместо std::set<std::string>
слов создайте std::map<std::string, std::vector<string>>
(или std::unordered_map
, хотя на английском языке достаточно слов, которые, вероятно, не будут иметь большого значения). Когда вы прочитаете слово из словаря, создайте отсортированную версию этой строки. Используйте это как ключ и нажмите исходную версию слова на вектор для этого ключа.
Затем, когда вы получаете слово от пользователя, сортируйте его, посмотрите, что на карте, и связанный вектор будет содержать каждое слово (из вашего словаря), которое может быть создано из этих букв.
1.Если вы используете std::map
вместо std::unordered_map
, это должно быть чем-то вроде N!/(log N)
, но N!
растет так быстро, и log N
растет так медленно, что это различие незначительно (если вы получите N достаточно большим, чтобы log N = 3, N! Будет настолько большим что N!/log N шагов вычисления ... ну, вы начинаете входить в вопросы космологии, например, будет ли вселенная умерла от смерти от жары до этого (на что ответ кажется «да, возможно»).
Что вы делали до сих пор? У вас есть словарь юридических слов для проверки? – bstamour
Вы имеете в виду содержательные слова или перестановки этих букв? –
значащие слова, но я думаю, что пример перестановки был бы хорошим пример – user2881555