namespace Core.Blueprint.Storage { public class TrieNode { public Dictionary Children { get; private set; } public bool IsEndOfWord { get; set; } public TrieNode() { Children = []; IsEndOfWord = false; } } public class Trie { private readonly TrieNode _root; public Trie() { _root = new TrieNode(); } public void Insert(string word) { var node = _root; foreach (var ch in word) { if (!node.Children.ContainsKey(ch)) { node.Children[ch] = new TrieNode(); } node = node.Children[ch]; } node.IsEndOfWord = true; } public List SearchByPrefix(string? prefix) { var results = new List(); var node = _root; foreach (var ch in prefix) { if (!node.Children.ContainsKey(ch)) { return results; } node = node.Children[ch]; } SearchByPrefixHelper(node, prefix, results); return results; } private void SearchByPrefixHelper(TrieNode node, string currentPrefix, List results) { if (node.IsEndOfWord) { results.Add(currentPrefix); } foreach (var kvp in node.Children) { SearchByPrefixHelper(kvp.Value, currentPrefix + kvp.Key, results); } } } }