gpt4 book ai didi

c++ - 从结构中打印单词

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:26:04 24 4
gpt4 key购买 nike

对于一个trie结构如下。

struct Trie {

bool eow; //when a Trie field isWord = true, hence there is a word
char letter;
Trie *letters[27];

};

我正在尝试为自动完成程序创建一个函数,它基本上在给定特定字符串前缀的情况下打印出 trie 中的单词

这是我所拥有的:

int wordcheck( TrieNode &node )
{
if (node.isWord == 1) // you have found your word, so return true
{
return 1;
}
for (int i = 0; i < 26; i++)
{
if (node.letters[i] != NULL && wordcheck(*(node.letters[i])))
{
return 1;
}
}
return 0;
}



string find (TrieNode &node, const string &word, string acc)
{
if (word.length() == 0)
{
string x = "";
if (node.isWord == 1){
x = " ";
int check = 1;
for(int i = 0; i < 26; i++)
{
if (node.letters[i] != NULL && wordcheck(*(node.letters[i])))
{
x = x + acc; check = 0; break;
}
}
if(check == 1)
{ return x; }
}
for (int i = 0; i < 26; i++){
if (node.letters[i] != NULL && wordcheck(*(node.letters[i])))
{
char let = (char)(i + (int)'a');
if (x[x.length() - 1 ] == ' ')
{
x = x + acc;
}
x = x + node.letters[i]->letter
+ find(*(node.letters[i]), word, acc + node.letters[i]->letter);
}
}
return x;
}
else if (node.letters[word[0] - 'a'] == NULL)
{ return ""; }
else {
return word[0] + find(*(node.letters[ word[0] - 'a']),
word.substr(1, word.length()-1),
acc + word[0]);
}
}

它似乎可以工作,但如果我给它一个长前缀,它会打印出比前缀短的单词。我使用了累积递归,我相信有一种更有效的方法可以做到这一点。我的问题是,是否有人可以做到这一点,以便我返回正确的字符串,或者尽可能指导我完成更简单的算法?

最佳答案

I'm trying to create a function for an auto completion program, that basically prints out words in a trie given a specific string prefix

我不会分析你的程序 - 对我来说它太复杂了,例如我不知道 wordcheck 应该做什么?为什么不是 bool 而是 int?你真的需要检查你的子树有没有词,你真的有没有词的非空树吗?

首先 - 要打印所有以给定前缀开头的单词 - 你需要转到所有这些单词开始的节点:

TrieNode* TreeNode::get(std::string word)
{
TreeNode* retVal = this;
for (size_t i = 0; i < word.length(); ++i) {
if (Words[i] < 'a' || words[i] > 'z')
throw std::runtime_error("Wrong word");
if (retVal->letters[word[i] - 'a'] != NULL)
retVal = retVal->letters[word[i] - 'a'];
else
return nullptr;
}
return retVal;
}

您需要打印给定节点中所有单词的函数:

void TreeNode::printAll(std::ostream& os, std::string prefix)
{
if (isWord)
os << prefix << "\n";
for (size_t i = 0; i < 26; ++i) {
if (retVal->letters[i] != NULL)
// this recursive call can be replaced with iterative solution with stack
letters[i]->print(os, prefix + char('a' + i));
}
}

结合这些功能 - 给你你想要的:

void TreeNode::printBeginWith(std::ostream& os, std::string prefix)
{
TreeNode* node = get(prefix);
if (node)
node->printAll(os, prefix);
}

关于c++ - 从结构中打印单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12985460/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com