数据结构与算法--Trie树/字典树

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的单词(字典树+最小堆)

参考:

动画Trie前缀树 - 知乎 (zhihu.com)

trie树(前缀树) - 罗松超 - 博客园 (cnblogs.com)

海量数据处理面试题集锦_v_JULY_v的博客-CSDN博客

猜你喜欢

转载自blog.csdn.net/qq_41021141/article/details/131333704