从结构上打印单词
Printing words from structure
对于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]);
}
}
如果我给它一个长前缀,它似乎有效,除了它的前缀,它的单词将比前缀短。我使用了累积递归,并且确保有一种更有效的方法可以做到这一点。我的问题是,是否有人可以这样做,以便我返回正确的字符串,或者如果可能的话,请引导我通过更轻松的算法?
我正在尝试为自动完成程序创建一个函数,该程序基本上在trie中打印出给定特定字符串前缀
的单词
我不会分析您的程序 - 对我来说太复杂了,例如我不知道wordcheck
应该做什么?为什么不是bool
而不是int
?您是否真的需要检查您的子Trie是否有任何言语,您是否真的有没有空的Trie?
首先 - 要打印以给定前缀开头的所有单词 - 您需要转到所有这些单词开始的节点:
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++中打印特定行数
- 如何打印 BFS 路径本身而不是此单词梯的路径长度?
- 用最少的元音打印单词
- 延迟逐个字符打印单词
- 我的控制台正在打印随机单词以及没有执行正确的数学运算
- 如何在 STL 中使用reverse_iterator打印单词
- 如果该行包含特定单词 (C++),请打印该行
- 用句子从单词打印单词
- 打印所有可能有 4 个字母的单词的时间太多
- 打印出使用地图实现的Trie中的所有单词
- 如何在带有给定特定前缀的向量中打印出单词
- 使用Trie打印所有字典的单词
- (C++) 打印字符数组字符串的单词时出现问题
- 动态分配的数组C 读取句子并打印单词
- 如何将消息发送到缓冲区并反向打印前三个单词的消息
- 打印以 "a" 开头的单词(字符串中)
- 打印由用户定义的数组,第一个数字确定单词的大小,第二个数字确定行的大小
- 如何在单词中打印元音
- 从结构上打印单词
- 如何从.txt文件复制单词到数组.然后将每个单词打印在单独的一行上