class Trie {
public:
Trie* c[26];
bool isstring;
Trie(){
memset(c, 0, sizeof(c));
isstring = false;
}
Trie* searchPrefix(string& prefix) {
Trie* p = this;
for(char& ch: prefix){
int index = ch-'a';
if(!p->c[index]){
return 0;
}
p = p->c[index];
}
return p;
}
void insert(string& word) {
Trie* p = this;
for(char& c: word){
int index = c-'a';
if(p->c[index] == 0){
p->c[index] = new Trie();
}
p = p->c[index];
}
p->isstring = true;
}
bool search(string& word) {
Trie* p = searchPrefix(word);
return p && p->isstring;
}
bool startsWith(string& prefix) {
return searchPrefix(prefix);
}
};
字典树应用:
查询某个单词是否出现过、出现频次
查询某个单词是否作为前缀出现过、出现频次
字符串去重
统计n个单词中出现最频繁的k的单词(字典树+最小堆)
参考: