力扣208. 实现 Trie (前缀树)

2024-01-07 22:46:25

字典树

  • 思路:
    • 定义
      • 使用子节点数据结构使用一个26叉数组分别对应 a-z;
      • 使用 isEnd 标记是否为字符串结尾;
    • 插入:
      • 子节点存在,将指针移动子节点,继续处理下一个字符;
      • 如果子节点不存在,则创建节点记录在?children?数组的对应位置上,然后沿着指针移动到子节点,继续搜索下一个字符;
      • 重复以上步骤,直到处理字符串的最后一个字符,然后将当前节点标记为字符串的结尾;
    • 查找前缀:
      • 子节点存在,沿着指针移动到子节点,继续搜索下一个字符;
      • 子节点不存在,说明字典树中不包含该前缀,返回空指针;
class Trie {
public:
    Trie() :
    children(26),
    isEnd(false) {
    }
    
    void insert(string word) {
        Trie* node = this;
        for (char ch : word) {
            ch -= 'a';
            if (node->children[ch] == nullptr) {
                node->children[ch] = new Trie();
            }

            node = node->children[ch];
        }

        node->isEnd = true;
    }
    
    bool search(string word) {
        Trie* node = searchPrefix(word);
        return node != nullptr && node->isEnd;
    }
    
    bool startsWith(string prefix) {
        return searchPrefix(prefix) != nullptr;
    }

private:
    Trie* searchPrefix(std::string prefix) {
        Trie* node = this;
        for (char ch : prefix) {
            ch -= 'a';
            if (node->children[ch] == nullptr) {
                return nullptr;
            }

            node = node->children[ch];
        }

        return node;
    }

private:
    std::vector<Trie*> children;
    bool isEnd;
};

/**
 * Your Trie object will be instantiated and called as such:
 * Trie* obj = new Trie();
 * obj->insert(word);
 * bool param_2 = obj->search(word);
 * bool param_3 = obj->startsWith(prefix);
 */
  • 关于字典树将会有专栏基于开源库进一步研究,敬请期待 ... ...

文章来源:https://blog.csdn.net/N_BenBird/article/details/135430963
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。