use std::collections::HashMap;
struct TrieNode {
children: HashMap<char, Box<TrieNode>>,
is_end: bool,
}
impl TrieNode {
fn new() -> Self {
TrieNode {
children: HashMap::new(),
is_end: false,
}
}
}
struct Trie {
root: TrieNode,
}
impl Trie {
fn new() -> Self {
Trie {
root: TrieNode::new(),
}
}
fn insert(&mut self, word: &str) {
let mut node = &mut self.root;
for ch in word.chars() {
node = node.children.entry(ch).or_insert_with(|| Box::new(TrieNode::new())); // advance or create node
}
node.is_end = true; // mark end of word
}
fn autocomplete(&self, prefix: &str) -> Vec<String> {
let mut node = &self.root;
for ch in prefix.chars() {
if let Some(next_node) = node.children.get(&ch) {
node = next_node; // follow prefix path
} else {
return vec![]; // prefix not found
}
}
let mut results = Vec::new();
Self::dfs(node, prefix.to_string(), &mut results); // collect words
results
}
fn dfs(node: &TrieNode, path: String, results: &mut Vec<String>) {
if node.is_end {
results.push(path.clone()); // found complete word
}
for (ch, child) in &node.children {
let mut new_path = path.clone();
new_path.push(*ch); // add next letter
Self::dfs(child, new_path, results); // recurse
}
}
}
fn main() {
let mut trie = Trie::new();
let words = ["cat", "car", "cow", "dog"];
for &word in &words {
trie.insert(word);
}
let prefix = "ca";
let completions = trie.autocomplete(prefix);
println!("Autocomplete results for \"{}\": {:?}", prefix, completions);
}node = node.children.entry(ch).or_insert_with(|| Box::new(TrieNode::new()));
advance or create child node for current letter
mark current node as end of a word
if let Some(next_node) = node.children.get(&ch) { node = next_node; } else { return vec![]; }
follow prefix path or return empty if prefix missing
Self::dfs(node, prefix.to_string(), &mut results);
start depth-first search to collect all words below prefix node
if node.is_end { results.push(path.clone()); }
add word to results when end of word reached
for (ch, child) in &node.children { ... Self::dfs(child, new_path, results); }
recurse on all children to find all completions
Autocomplete results for "ca": ["cat", "car"]