力扣 208. 实现 Trie (前缀树)

56 阅读1分钟

🔗 leetcode.cn/problems/im…

题目

  • 实现 trie 树

思路

  • 26 个子孩子,有后续的字母,就扩展对应的 node 指针,若当前结尾,则进行标记

代码

class Trie {
public:
    struct node {
        bool is_end;
        vector<node*> values;
        node() { 
            is_end = false; 
            values.resize(26); 
        }
    };

    struct node* handle;
    Trie() {
        handle = new node();
        handle->is_end = false;
    }
    
    void insert(string word) {
        node* curr = handle;
        for (char ch : word) {
            if (curr->values[ch - 'a'] == nullptr) {
                curr->values[ch - 'a'] = new node();
                curr = curr->values[ch - 'a'];
            } else {
                curr = curr->values[ch - 'a'];
            }
        }
        curr->is_end = true;
    }
    
    bool search(string word) {
        node* curr = handle;
        for (char ch : word) {
            if (curr->values[ch - 'a'] == nullptr) return false;
            curr = curr->values[ch - 'a'];
        }
        return curr->is_end;
        
    }
    
    bool startsWith(string prefix) {
        node* curr = handle;
        for (char ch : prefix) {
            if (curr->values[ch - 'a'] == nullptr) return false;
            curr = curr->values[ch - 'a'];
        }
        return true;
    }

};

/**
 * Your Trie object will be instantiated and called as such:
 * Trie* obj = new Trie();
 * obj->insert(word);
 * bool param_2 = obj->search(word);
 * bool param_3 = obj->startsWith(prefix);
 */