Yes, I know generating string could be quite slow, although I've optimized it as much as I could.
I don't think that dividing dictionaries (in your example to 3, 4 or 5 word letters) will speed it up, because the generation process is self is what most time consuming, not checking it in dictionary.
What could improve the performance is another method that class have, but I haven't override it in custom example, because I wanted to make it simple.
This method is called dictionary_test, basically word_solver passes strings, which are in generating process to this function, and if this function returns true, it means, there is a string which starts with provided substring, if it return false, it means, there is no string which starts with this substring and word_solver discards it and tries to generate other string.
It speeds up the process, because it drops generating strings if it sees, that there can't be any word starting with it. For example if there are no words in dictionary, that starts with "x", then once word_solver tries "x" and gets false, no more strings starting with "x" will be generated, which drops out large quantity of possibilities and increases performance.
So what you can try to do, is to override dictionary_test method inside custom_word_solver.php file and implement some kind of logic, which would determine if there is any word starting with provided string, something like this:
protected function dictionary_test($string){ 
        $ret = false; 
        if(checking_if_word_can_start_with($string))
        {
                $ret = true;
        }
        return $ret; 
}
I can't come up with efficient way to check if word starts with string right now, but most easy way would be to iterate through all words and check if(strpos($word, $string) === 0), but again with a lot of word in dictionary it would become inefficient to do it like this.
This is where you may want to try to separate dictionaries by first letter, or combining by first, second and maybe even third letters in word.
For this case Trie structure should be most efficient.
en.wikipedia.org/wiki/Trie
I've found one implementation for PHP, but haven't tried it:
code.google.com/p/phptrie/