LeetCode-in-Rust

208. Implement Trie (Prefix Tree)

Medium

A trie (pronounced as “try”) or prefix tree is a tree data structure used to efficiently store and retrieve keys in a dataset of strings. There are various applications of this data structure, such as autocomplete and spellchecker.

Implement the Trie class:

Example 1:

Input [“Trie”, “insert”, “search”, “search”, “startsWith”, “insert”, “search”] [[], [“apple”], [“apple”], [“app”], [“app”], [“app”], [“app”]]

Output: [null, null, true, false, true, null, true]

Explanation:

Trie trie = new Trie();

trie.insert(“apple”);

trie.search(“apple”); // return True

trie.search(“app”); // return False

trie.startsWith(“app”); // return True

trie.insert(“app”);

trie.search(“app”); // return True

Constraints:

Solution

use std::collections::HashMap;

struct Trie {
    tree: HashMap<char, Vec<String>>
}

/**
  * `&self` means the method takes an immutable reference
  * If you need a mutable reference, change it to `&mut self` instead.
 */
impl Trie {

    fn new() -> Self {
        Trie{tree:HashMap::new()}
    }

    fn insert(&mut self, word: String) {
        self.tree.entry(word.chars().next().unwrap()).or_default().push(word);
    }

    fn search(&self, word: String) -> bool {
        if let Some(vals) = self.tree.get(&word.chars().next().unwrap()) {
            return vals.contains(&word)
        }
        false
    }

    fn starts_with(&self, prefix: String) -> bool {
        if let Some(vals) = self.tree.get(&prefix.chars().next().unwrap()) {
            return vals.iter().any(|word| word.starts_with(&prefix))
        }
        false
    }
}

/**
 * Your Trie object will be instantiated and called as such:
 * let obj = Trie::new();
 * obj.insert(word);
 * let ret_2: bool = obj.search(word);
 * let ret_3: bool = obj.starts_with(prefix);
 */