题目
Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。
请你实现 Trie 类:
- Trie() 初始化前缀树对象。
- void insert(String word) 向前缀树中插入字符串 word 。
- boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false 。
- boolean startsWith(String prefix) 如果之前已经插入的字符串 word 的前缀之一为 prefix ,返回 true ;否则,返回 false 。
示例:
输入 ["Trie", "insert", "search", "search", "startsWith", "insert", "search"] [[], ["apple"], ["apple"], ["app"], ["app"], ["app"], ["app"]] 输出 [null, null, true, false, true, null, true] 解释 Trie trie = new Trie(); trie.insert("apple"); trie.search("apple"); // 返回 True trie.search("app"); // 返回 False trie.startsWith("app"); // 返回 True trie.insert("app"); trie.search("app"); // 返回 True
解题
方法一:实现Trie
class Trie { private: bool isEnd;//该结点是否是一个串的结束 Trie* next[26];//字母映射表 public: Trie() { isEnd=false; memset(next,0,sizeof(next)); } void insert(string word) { Trie* node=this; for(char c:word){ if(node->next[c-'a']==NULL){ node->next[c-'a']=new Trie(); } node=node->next[c-'a']; } node->isEnd=true; } bool search(string word) { Trie* node=this; for(char c:word){ node=node->next[c-'a']; if(node==NULL) return false; } return node->isEnd; } bool startsWith(string prefix) { Trie* node=this; for(char c:prefix){ node=node->next[c-'a']; if(node==NULL) return false; } return true; } };
换种写法(更具c++风格)
class Trie { private: bool isEnd; vector<Trie*> next; public: Trie() { isEnd=false; next=vector<Trie*>(26,nullptr); } void insert(string word) { Trie* node=this; for(char c:word){ if(node->next[c-'a']==nullptr){ node->next[c-'a']=new Trie(); } node=node->next[c-'a']; } node->isEnd=true; } bool search(string word) { Trie* node=this; for(char c:word){ if(node->next[c-'a']) node=node->next[c-'a']; else return false; } return node->isEnd; } bool startsWith(string prefix) { Trie* node=this; for(char c:prefix){ if(node->next[c-'a']) node=node->next[c-'a']; else return false; } return true; } };