private string[] Solve(WordRack originalRack, PrefixTreeNode root) { List <string> words = new List <string>(); foreach (char character in originalRack.AvailableLetters) { WordRack rack = originalRack.Clone(); PrefixTreeNode node = root.Children.FirstOrDefault(x => x.Letter == character); if (node != null) { rack.Consume(character); if (node.IsWord) { words.Add(node.GetWord()); } string[] result = this.Solve(rack, node); if (result != null && result.Length > 0) { words.AddRange(result); } } } return(words.ToArray()); }
public void Insert(string word) { if (word.Length == 0) { throw new ArgumentNullException("word"); } _count++; char[] characters = word.ToLower().ToCharArray(); PrefixTreeNode current = _root; for (int index = 0; index < word.Length; index++) { PrefixTreeNode child = current.FindNode(characters[index]); if (child != null) { current = child; } else { current.Children.Add(new PrefixTreeNode(current, characters[index])); current = current.FindNode(characters[index]); } if (index == characters.Length - 1) { current.IsWord = true; } } }
internal PrefixTreeNode(PrefixTreeNode parent, char letter) { _parent = parent; _children = new List <PrefixTreeNode>(); _isWord = false; _letter = letter; }
public string GetWord() { List <char> sb = new List <char>(); sb.Add(_letter); PrefixTreeNode parent = this.Parent; while (parent != null && parent.Letter != '\0') { sb.Add(parent.Letter); parent = parent.Parent; } return(new string(sb.Reverse <char>().ToArray())); }
private bool IsMatch(string word, bool exact) { if (string.IsNullOrEmpty(word)) { return(false); } PrefixTreeNode current = _root; char[] letters = word.ToLowerInvariant().ToCharArray(); while (current != null) { for (int index = 0; index < letters.Length; index++) { if (current.FindNode(letters[index]) == null) { return(false); } current = current.FindNode(letters[index]); } return(exact ? (current.IsWord ? true : false) : true); } return(false); }
public PrefixTree() { _root = new PrefixTreeNode(null, '\0'); }