trie数据结构中的所有单词

时间:2012-10-20 16:57:31

标签: c++ algorithm data-structures trie

我正在尝试将所有单词放在字符串中的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 "";
}

它没有输出我想要的,有什么建议吗?

1 个答案:

答案 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;