标签:leetcode
Implement a trie with insert
, search
, and startsWith
methods.
Note:
You may assume that all inputs are consist of lowercase letters a-z
.
Trie树又被称为字典树、前缀树,是一种用于快速检索的多叉树。Tried树可以利用字符串的公共前缀来节省存储空间。
但如果系统存在大量没有公共前缀的字符串,相应的Trie树将非常消耗内存。(下图为Wiki上的Trie树示意图, https://en.wikipedia.org/wiki/Trie)
Trie树的基本性质如下:
本题中的Trie树可以简单实现如下:
Trie树节点数据结构定义如下:
class TrieNode { public: char var; bool isWord; TrieNode* children[26]; // Initialize your data structure here. TrieNode() { var = 0; isWord = false; memset(children, 0x0, sizeof(TreeNode*)*26); } TrieNode(char c){ var = c; isWord = false; memset(children, 0x0, sizeof(TreeNode*)*26); } };
class Trie { public: Trie() { root = new TrieNode(); } // Inserts a word into the trie. void insert(string word) { TrieNode* pNode = root; if (word.length() <= 0) { return; } for (int i= 0; i<word.length(); i++) { char c= word[i]; if (pNode->children[c-'a'] == 0) { TrieNode *pNew = new TrieNode(c); pNode->children[c-'a'] = pNew; } pNode = pNode->children[c-'a']; } pNode->isWord = true; } // Returns if the word is in the trie. bool search(string word) { TrieNode *pNode = root; if (word.length() <= 0) return true; for (int i =0; i<word.length(); i++) { char c = word[i]; pNode = pNode->children[c-'a']; if (pNode == NULL) return false; } return pNode->isWord; } // Returns if there is any word in the trie // that starts with the given prefix. bool startsWith(string prefix) { TrieNode *pNode = root; if (prefix.length()<=0) return true; for (int i=0; i<prefix.length(); i++) { char c = prefix[i]; pNode = pNode->children[c-'a']; if (pNode == NULL) return false; } return true; } void freeTrieNode(TrieNode* pNode){ if (pNode == NULL) return; for (int i=0; i<26;i++) { TrieNode* pChild = pNode->children[i]; if (pChild != NULL) { freeTrieNode(pChild); } } free(pNode); } ~Trie(){ freeTrieNode(root); } private: TrieNode* root; };
版权声明:本文为博主原创文章,未经博主允许不得转载。
LeetCode 208: Implement Trie (Prefix Tree)
标签:leetcode
原文地址:http://blog.csdn.net/sunao2002002/article/details/46661761