예제 #1
0
        private bool ContainsValue(Node currentNode, string value, int index)
        {
            if (currentNode == null)
                return false;

            if (currentNode.Value == value && currentNode.IsCompleteWord)
                return true;

            return ContainsValue(currentNode.Children[value[index]], value, index + 1);
        }
예제 #2
0
        private List<List<string>> FindAllAnagrams(Node root, Node currentNode, Dictionary<char, int> phraseDictionary, List<string> candidates)
        {
            var remainingChars = GetRemainingCharacters(phraseDictionary);

            if (remainingChars.Count == 0 && currentNode.IsCompleteWord)
            {
                currentNode.IsUsed = true;
                candidates.Add(currentNode.Value);
                return new List<List<string>> { candidates };
            }

            if (remainingChars.Count == 0)
                return null;

            var allAnagrams = new List<List<string>>();

            foreach (var character in remainingChars)
            {
                phraseDictionary[character]--;

                if (currentNode.Children.ContainsKey(character) && !currentNode.Children[character].IsUsed)
                {
                    var copy = candidates.ToList();

                    var anagrams = FindAllAnagrams(root, currentNode.Children[character], phraseDictionary, copy);
                    if (anagrams != null)
                        allAnagrams.AddRange(anagrams);
                }

                phraseDictionary[character]++;
            }

            if (IsCandidate(currentNode))
            {
                //Found a candidate word, search for next one
                candidates.Add(currentNode.Value);
                currentNode.IsUsed = true;

                var anagrams = FindAllAnagrams(root, root, phraseDictionary, candidates);
                if (anagrams != null)
                    allAnagrams.AddRange(anagrams);
            }

            foreach (var node in currentNode.Children.Values)
            {
                node.IsUsed = false;
            }

            return allAnagrams;
        }
예제 #3
0
        private void AddNode(Node currentNode, string value, int index)
        {
            if (currentNode.Value == value)
                currentNode.IsCompleteWord = true;

            if (index == value.Length)
                return;

            var key = value[index];

            if (!currentNode.Children.ContainsKey(key))
            {
                var newNode = new Node(key, value.Substring(0, index + 1));
                currentNode.Children.Add(key, newNode);
            }

            currentNode = currentNode.Children[key];
            AddNode(currentNode, value, index + 1);
        }
예제 #4
0
 public Trie()
 {
     _root = new Node(' ', string.Empty);
 }
예제 #5
0
        private bool IsCandidate(Node node)
        {
            //add word to possible list if current node is complete word and:
            //node is leaf
            //node is not leaf but all children have been used

            if (!node.IsCompleteWord)
                return false;

            if (node.Children.Keys.Count == 0 || node.Children.Values.Count == 0)
                return true;

            if (node.Children.Values.All(x => x.IsUsed))
                return true;

            return false;
        }