版本比较

标识

  • 该行被添加。
  • 该行被删除。
  • 格式已经改变。

...

  1. void insert(string word):插入字符串word。
  2. bool search(string word):返回字符串word是否存在于前缀树中。
  3. bool startWith(string prefix):返回指定的前缀是否存在于前缀树中。
  4. vector<string> listStartWith(string prefix):返回指定前缀的全部字符串。这个接口也可以设计成返回出现次数最多的前n个字符串。

以下是一个字典树的模板:以下是一个精简版的字典树的模板:

代码块
class Trie {
private:
    int nxt[100000][26] = {0};  vector<Trie*> children// 使用数组来保存树结构,最大支持100000个结点
	int cnt = 0;
    bool isEndexist[100000] = {0};

public:
    Trie* searchPrefix() {}
    
    void insert(string prefixword) {
        Trie*int nodep = this0;
        for (charauto ch : prefixword) {
            ch -= 'a';
            if (node->children(!nxt[p][ch] == nullptr) {
                 return nullptrnxt[p][ch] = ++cnt;
            }
            nodep = node->childrennxt[p][ch];
        }
        exist[p] return= node1;
    }

public:
    Trie() : children(26), isEnd(false) {}
    

    void insertbool search(string word) {
        Trie*int nodep = this0;
        for (charauto ch : word) {
            ch -= 'a';
            if (node->children(!nxt[p][ch] == nullptr) {
                node->children[ch] = new Trie()return false;
            }
            nodep = node->childrennxt[p][ch];
        }
        node->isEnd = truereturn exist[p];
    }

    bool searchstartsWith(string wordprefix) {
        Trie*int nodep = this->searchPrefix(word); 0;
        for(auto ch : prefix) {
        return node != nullptr &&ch node->isEnd= 'a';
    }

       bool startsWith(string prefixif(!nxt[p][ch]) {
                return this->searchPrefix(prefix) != nullptr false;
            }
            p = nxt[p][ch];
        }
        return true;
    }
};


例题: