原题地址:https://leetcode-cn.com/problems/implement-trie-prefix-tree/description/
题目描述:
实现一个 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 构成的。
保证所有输入均为非空字符串。
解题方案:
首先看一下trie树的概念:https://blog.csdn.net/cq340321/article/details/60476935、 https://blog.csdn.net/qq_33297776/article/details/82315859
本题关键是自己再去定义树的节点Node。
class Node{
public:
Node* next[26];
int num;
Node(){
num = 0;
for(int i=0;i<26;i++)
next[i] = NULL;
}
};
class Trie {
public:
/** Initialize your data structure here. */
Node* root;
Trie() {
root = new Node();
}
/** Inserts a word into the trie. */
void insert(string word) {
//cout<<"inserting "<<word<<endl;
Node* p = root;
for(int i=0;i<word.size();i++){
if(p->next[word[i]-'a']==NULL){
p->next[word[i]-'a'] = new Node();
}
p = p->next[word[i]-'a'];
}
p->num++;
}
/** Returns if the word is in the trie. */
bool search(string word) {
//cout<<"searching "<<word<<" ";
Node* p = root;
for(int i=0;i<word.size();i++){
if(p->next[word[i]-'a']==NULL){
//cout<<"false"<<endl;
return false;
}
p = p->next[word[i]-'a'];
}
if(p->num!=0){
//cout<<"true"<<endl;
return true;
}
else{
//cout<<"false"<<endl;
return false;
}
}
/** Returns if there is any word in the trie that starts with the given prefix. */
bool startsWith(string prefix) {
//cout<<"start with "<<prefix<<endl;
Node* p = root;
for(int i=0;i<prefix.size();i++){
if(p->next[prefix[i]-'a']==NULL) return false;
p = p->next[prefix[i]-'a'];
}
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);
*/