题目描述:
实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作。
示例:
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
说明:
你可以假设所有的输入都是由小写字母 a-z 构成的。
保证所有输入均为非空字符串。
方法1:
主要思路:
(1)先定义前缀树的结点;
class Trie {
public:
//树的结点的定义
struct Node{
bool is_end;
unordered_map<char,Node*> children;
Node(){
is_end=false;
}
};
Node* root;
/** Initialize your data structure here. */
Trie() {
root=new Node();
}
/** Inserts a word into the trie. */
void insert(string word) {
Node* cur=root;
for(char&ch:word){
if(!cur->children.count(ch)){
cur->children[ch]=new Node();
}
cur=cur->children[ch];
}
cur->is_end=true;//标识单词的结尾
}
/** Returns if the word is in the trie. */
bool search(string word) {
Node* cur=root;
//保证单词中的字符都存在
for(char&ch:word){
if(cur->children.count(ch)){
cur=cur->children[ch];
}
else{
return false;
}
}
//返回终止字符是否是单词的结尾
return cur->is_end;
}
/** Returns if there is any word in the trie that starts with the given prefix. */
bool startsWith(string prefix) {//搜索前缀
Node* cur=root;
//保证前缀中的字符都存在
for(char&ch:prefix){
if(cur->children.count(ch)){
cur=cur->children[ch];
}
else{
return false;
}
}
return true;
}
};
/**
* 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);
*/