如题所示,要求实现字典树的插入,查找单词,和查找前缀的方法。
Implement a trie with insert
, search
, and startsWith
methods.
Note:
You may assume that all inputs are consist of lowercase letters a-z
.
Subscribe to see which companies asked this question.
需要自己设置一个节点Node。节点中应当包含以下两个部分:
1 isEnd:bool类型的变量,主要判断该结点是否为一个单词。
2 child[26]:指向Node结点的指针,下标0~25分别指向26个字母。
在插入的时候,需要在单词的最后一个字母处,将isEnd设置为true。
在查找单词的时候,除了确定字典树中包含了这个单词以外,还要确定最后一个字母的结点中isEnd为true。
查找前缀则只需要是否每一个字母都出现在字典树中即可。
代码实现如下:
class Node{
public:
bool isEnd = false;
Node* child[26];
};
class Trie {
private:
Node* root;
public:
/** Initialize your data structure here. */
Trie() {
root = new Node();
}
/** Inserts a word into the trie. */
void insert(string word) {
Node *p=root;
for(unsigned int i=0;i<word.length();++i){
if(p->child[word[i]-'a'] == NULL){
Node* temp = new Node();
if(i == word.length()-1)
temp->isEnd = true;
p->child[word[i]-'a']=temp;
p=temp;
}else{
p = p->child[word[i]-'a'];
if(i == word.length()-1)
p->isEnd = true;
}
}
}
/** Returns if the word is in the trie. */
bool search(string word) {
Node *p= root;
for(unsigned int i=0;i<word.length();++i){
if(p->child[word[i]-'a'] == NULL)
return false;
p=p->child[word[i]-'a'];
}
if(p->isEnd == true)
return true;
else
return false;
}
/** Returns if there is any word in the trie that starts with the given prefix. */
bool startsWith(string prefix) {
Node *p = root;
for(unsigned int i=0;i<prefix.length();++i){
if(p->child[prefix[i]-'a'] == NULL)
return false;
p = p->child[prefix[i]-'a'];
}
return true;
}
};