我正在尝试将所有单词放在字符串中的trie中,eow
字段表示单词对于trie数据结构中的某个字符是真的,因此trie可以有字母而不是导致没有字,因为前“abc”在特里,但“c”的eow字段是假的所以“abc”不是一个字
这是我的数据结构
struct Trie {
bool eow; //when a Trie field isWord = true, hence there is a word
char letter;
Trie *letters[27];
};
这是我尝试过的print-all函数,基本上是试图将一个字符串中的所有单词分隔为单词空格
string printAll( string word, Trie& data)
{
if (data.eow == 1)
return word + " ";
for (int i = 0; i < 26; i++) {
if (data.letters[i] != NULL)
printAll( word + data.letters[i]->letter, *(data.letters[i]));
}
return "";
}
它没有输出我想要的,有什么建议吗?
答案 0 :(得分:0)
您没有使用递归printAll()
调用的返回值,因此您生成的所有子词都将丢失。尝试这样的事情:
string printAll(string word, const Trie& data)
{
string words;
if (data.eow)
words += word + " ";
for (int i = 0; i < 26; i++) {
if (data.letters[i] != NULL)
words += printAll( word + data.letters[i]->letter, *(data.letters[i]));
}
return words;
}
对于它的价值,这有点低效,因为它分配了大量的临时字符串。每个递归调用都有自己的words
字符串,该字符串是建立,返回和销毁的。将所有单词添加到一个字符串中会更好。
您也可以考虑使用单词矢量而不是将它们与空格一起添加。这样你就可以更容易地迭代每个单词。
void getWords(const Trie& data, vector<string> &words, string word = "")
{
if (data.eow)
words.push_back(word);
for (int i = 0; i < 26; i++) {
if (data.letters[i] != NULL)
getWords(*(data.letters[i]), words, word + data.letters[i]->letter);
}
}
然后调用它:
vector<string> words;
getWords(trie, words);
for (size_t i = 0; i < words.size(); ++i) {
if (i > 0)
cout << " ";
cout << words[i];
}
cout << endl;