public List<String> find(String input) {
        List<String> result = new ArrayList<String>();
        // sub-strings of length greater than max word length in dictionary are guaranteed not
        // to be found. So don't produce them as it is very costly.
        List<List<Character>> charLists = Combination.combination(input, maxWordLength);
        //each charList is sorted !!
        for (List<Character> charList : charLists) {
            //skip if combination does not have a match in sortedTrie
            //this will save a lot of costly permutation computation
            if (sortedTrie.contains(charList)) {
                List<String> words = Permutation.permuteAsStrings(charList);
                for (String word : words) {
                    if (trie.contains(word))
                        result.add(word);
                }
            }
        }
        return result;
    }