Контекст: я кодирую назначение в C ++, где пользователь вводит слово или предложение, чтобы расшифровать слово за словом. У меня есть текстовый файл, полный слов Engli sh, которые я прочитал в unordered_set строк. Затем я go перебираю каждое введенное слово и пытаюсь найти его в unordered_set. Возможности расшифровки слов распечатываются для пользователя.
Проблема: в текстовом файле много слов. Программа не работает должным образом, потому что она слишком долго go просматривает все перестановки и ищет совпадение в unordered_set.
Возможное решение: я хочу ограничить диапазон слов для поиска, потому что текстовый файл был уже в алфавитном порядке. Например, если зашифрованное слово было «cit», одна перестановка для этого слова была бы «it c». Я хочу найти все слова в unordered_set, начиная с i для "it c".
Вот что у меня есть.
void unscramble() {
//issue - too slow, find in range?
string word;
string temp;
ifstream inDictionaryFile("words_alpha.txt");
unordered_set<string> dictionary;
//read dictionary file into a unordered_set
while (getline(inDictionaryFile, temp)) {
auto result = dictionary.insert(temp + " ");
}
cout << "Enter something to unscramble: ";
//find/print out matches for permuations of scrambled words
while (cin>>word) {
do {
word = word + " ";
auto result = dictionary.find(word);
if (result != end(dictionary)) {
cout << setw(10) << word;
}
} while (next_permutation(begin(word), end(word)));
}
}