字典树:根节点不包含字符,除根节点外每一个节点都只包含一个字符; 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串; 每个节点的所有子节点包含的字符都不相同。
实现字典树的插入insert(),查找search(string key),判断是否有以某字符串为前缀的字符串starsWith(string s)。
实现代码如下,可以将bool hasWord改为一个int型来统计出现的词频。
class TrieNode {
public:
// Initialize your data structure here.
TrieNode() {
hasWord=false;
for(int i=0; i<26; ++i) {
child[i]=NULL;
}
}
char data;
bool hasWord;
TrieNode *child[26];
};
class Trie {
public:
Trie() {
root = new TrieNode();
}
// Inserts a word into the trie.
void insert(string s) {
if(s.empty()) {
return;
}
TrieNode *t = root->child[s[0]-'a'], *p=root;
for(int i=0; i<s.size(); ++i) {
if( t == NULL) {
t=new TrieNode();
t->data=s[i];
p->child[s[i]-'a']=t;
}
if( i+1 < s.size() ) {
p=t;
t=p->child[s[i+1]-'a'];
}
}
t->hasWord=true;
}
// Returns if the word is in the trie.
bool search(string key) {
if(key.empty()) {
return false;
}
TrieNode *p=root, *t=p->child[ key[0]-'a' ];
for(int i=0; i<key.size(); ++i) {
if(t == NULL) {
return false;
}
if( i+1 < key.size() ) {
p=t;
t=p->child[ key[i+1]-'a' ];
}
}
if(t->hasWord == false){
return false;
}
return true;
}
// Returns if there is any word in the trie
// that starts with the given prefix.
bool startsWith(string prefix) {
if(prefix.empty()) {
return false;
}
TrieNode *p=root, *t=p->child[ prefix[0]-'a' ];
for(int i=0; i<prefix.size(); ++i) {
if(t == NULL) {
return false;
}
if( i+1 < prefix.size() ) {
p=t;
t=p->child[ prefix[i+1]-'a' ];
}
}
return true;
}
private:
TrieNode* root;
};