[leetcode] 208. Implement Trie (Prefix Tree)

来源:互联网 发布:btob 知乎 编辑:程序博客网 时间:2024/06/06 00:16

Implement a trie with insertsearch, and startsWith methods.

Note:
You may assume that all inputs are consist of lowercase letters a-z.

这道题是实现字典树,题目难度为Medium。


可能还有同学不太了解字典树,不了解的同学可以先看下字典树在wiki上的页面(传送门)。字典树的优点是插入和查找的时间复杂度为O(m),m为单词长度,但空间复杂度比较庞大。看到一篇介绍Trie的博文写的比较详细,建议不了解字典树的同学也详细看一看(传送门)。


Trie没有析构函数,这里是需要析构函数的,所以加入了采用深度优先搜索的析构函数。其他部分应该没什么难度了,具体代码:

class TrieNode {public:    vector<TrieNode*> child;    bool isIn;    // Initialize your data structure here.    TrieNode() : child(vector<TrieNode*>(26, NULL)), isIn(false) {}};class Trie {public:    Trie() : root(new TrieNode()) {}    ~Trie() {        delNode(root);    }        void delNode(TrieNode* n) {        for(int i=0; i<26; ++i) {            if(n->child[i]) delNode(n->child[i]);        }        delete n;    }        // Inserts a word into the trie.    void insert(string word) {        TrieNode* n = root;        for(auto ch:word) {            if(n->child[ch-'a'] == NULL)                 n->child[ch-'a'] = new TrieNode();            n = n->child[ch-'a'];        }        n->isIn = true;    }    // Returns if the word is in the trie.    bool search(string word) {        TrieNode* n = root;        for(auto ch:word) {            if(n->child[ch-'a'] == NULL) return false;            n = n->child[ch-'a'];        }        return n->isIn;    }    // Returns if there is any word in the trie    // that starts with the given prefix.    bool startsWith(string prefix) {        TrieNode* n = root;        for(auto ch:prefix) {            if(n->child[ch-'a'] == NULL) return false;            n = n->child[ch-'a'];        }        return true;    }private:    TrieNode* root;};// Your Trie object will be instantiated and called as such:// Trie trie;// trie.insert("somestring");// trie.search("key");

0 0
原创粉丝点击