力扣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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
    	本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!