public List <string> GetPossibleWordsFromCharacters(string availableCharacters, string currentWord) { List <string> foundWords = new List <string>(); if (endsWord) { foundWords.Add(currentWord); } string distinctCharacters = new string(availableCharacters.Distinct().ToArray()); for (int i = 0; i < distinctCharacters.Length; i++) { char selectedCharacter = distinctCharacters[i]; int indexOfFirstCharacter = availableCharacters.IndexOf(selectedCharacter); string restOfInput = availableCharacters.Substring(0, indexOfFirstCharacter) + availableCharacters.Substring(indexOfFirstCharacter + 1, availableCharacters.Length - (indexOfFirstCharacter + 1)); string currentWordPrime = currentWord + selectedCharacter; if (ContainsChar(selectedCharacter)) { TrieBranch branchToCheck = childBranches[selectedCharacter]; foundWords.AddRange(branchToCheck.GetPossibleWordsFromCharacters(restOfInput, currentWordPrime)); } } return(foundWords); }