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');
 }