• 208. Implement Trie (Prefix Tree)


    问题描述:

    Implement a trie with insertsearch, and startsWith methods.

    Example:

    Trie trie = new Trie();
    
    trie.insert("apple");
    trie.search("apple");   // returns true
    trie.search("app");     // returns false
    trie.startsWith("app"); // returns true
    trie.insert("app");   
    trie.search("app");     // returns true
    

    Note:

    • You may assume that all inputs are consist of lowercase letters a-z.
    • All inputs are guaranteed to be non-empty strings.

    解题思路:

    参考了Grandyang的解法

    trie树是前缀检索树,是牺牲空间换时间的一个代表。

    为了实现trie树,我们要实现TrieNode节点类。

    类中包含 

    TrieNode* child[26]; //用于存储后面的节点
    bool isWord; //用于判断该点是否为单词结束的点。

     注意在构造方法中:  

    TrieNode(): isWord(false){
            for(auto &a: child)
                a = NULL;
        }

    对此给出的解释是:“不加引用&,等于没有初始化,相当于新建个临时的a,给临时a初始化了不会改变原有的指针的。”

    代码:

    class TrieNode{
    public:
        TrieNode* child[26];
        bool isWord;
        TrieNode(): isWord(false){
            for(auto &a: child)
                a = NULL;
        }
    };
    class Trie {
    public:
        /** Initialize your data structure here. */
        Trie() {
            root = new TrieNode();
        }
        
        /** Inserts a word into the trie. */
        void insert(string word) {
            TrieNode *p = root;
            for(auto a: word){
                int i = a - 'a';
                if(!p->child[i])
                    p->child[i] = new TrieNode();
                p = p->child[i];
            }
            p->isWord = true;
        }
        
        /** Returns if the word is in the trie. */
        bool search(string word) {
            TrieNode *p = root;
            for(auto a: word){
                int i = a - 'a';
                if(!p->child[i]) 
                    return false;
                p = p->child[i];
            }
            return p->isWord;
        }
        
        /** Returns if there is any word in the trie that starts with the given prefix. */
        bool startsWith(string prefix) {
            TrieNode *p = root;
            for(auto a:prefix){
                int i = a - 'a';
                if(!p->child[i])
                    return false;
                p = p->child[i];
            }
            return true;
        }
    private:
        TrieNode *root;
    };
  • 相关阅读:
    Golang-单元测试
    Golang-Json序列化和反序列化
    Golang-文件操作
    Golang-demo
    Golang-demo练习
    Golang-类型断言
    Golang-面向对象编程三大特性-多态
    Golang-接口(interface)
    Golang-面向对象编程三大特性-继承、多重继承
    块状元素和内联元素 【转】
  • 原文地址:https://www.cnblogs.com/yaoyudadudu/p/9177211.html
Copyright © 2020-2023  润新知