首页 > 解决方案 > 如何使用特里树修复我的自动完成功能实现?

问题描述

嗨所以我一直在尝试使用特里树实现自动完成/建议,但建议部分只建议 1 或 2 个第一个相似的词,我无法找出导致这种情况的原因。

这是我的特里结构

 struct TrieNode {
        struct TrieNode* children[ALPHABET_SIZE];

        bool isEndOfWord;
};


struct TrieNode* getNode(void) {
       struct TrieNode* pNode = new TrieNode;

       pNode->isEndOfWord = false;

       for (int i = 0; i < ALPHABET_SIZE; i++)
            pNode->children[i] = NULL;

       return pNode;
}

bool isLeafNode(struct TrieNode* root) { return root->isEndOfWord != false; } 

这是建议/自动完成部分

void suggestionsRec(struct TrieNode* root, string currPrefix) {
     if (root->isEndOfWord) {
         cout << currPrefix;
         cout << endl;
     }

     if (isLeafNode(root))
         return;

    for (int i = 0; i < ALPHABET_SIZE; i++)
    {
        if (root->children[i])
        {
            currPrefix.push_back(97 + i);
            suggestionsRec(root->children[i], currPrefix);
            currPrefix.pop_back();
        }
    }
}

int spellchecker(TrieNode* root, const string query) {
    struct TrieNode* pCrawl = root;
    int level;
    int n = query.length();

    for (level = 0; level < n; level++) {
         int index = CHAR_TO_INDEX(query[level]);
         if (!pCrawl->children[index])
             return 0;
         pCrawl = pCrawl->children[index];
    }

    bool isWord = (pCrawl->isEndOfWord == true);
    bool isLast = isLeafNode(pCrawl);

    if (isWord && isLast) {
        cout << query << endl;
        return -1;
    }

    if (!isLast) {
        string prefix = query;
        suggestionsRec(pCrawl, prefix);
        return 1;
    }
}

例如,当我尝试这样的词时:[the , there , these ] 并且输入是“t”,它所暗示的只是“the”。

这是整个代码https://pastebin.com/VPd94rny

任何改进我的代码的建议都非常感谢

标签: c++

解决方案


推荐阅读