パーミュテーションを生成し、それを単語に分解する2段階ソリューションの代わりに、再帰的にパーミュテーションを生成するときに有効な単語をチェックすることでスピードアップできます。あなたの現在の部分的に完全な順列が有効な単語に対応していない場合は、そこで停止し、それ以上は再帰しないでください。これは、無駄な順列を生成する時間を無駄にしないことを意味します。たとえば、 "tt"を生成する場合、 "peanubuter"を並べ替える必要はなく、ttで始まる英語の単語がないため、すべての順列を "tt"に追加する必要はありません。
基本的な再帰的置換の生成を行い、生成した現在の部分的な単語を追跡しているとします。有効な単語であれば、スペースを出力して新しい単語を開始し、残りの文字を再帰的に並べ替えることができます。現在の部分的な単語に残りの文字をそれぞれ追加することもできます。有効な部分的な単語(つまり、それらの文字から始まる単語)が得られた場合にのみ再帰します。このような
何か(擬似コード):
void generateAnagrams(String partialAnagram, String currentWord, String remainingChars)
{
// at each point, you can either output a space, or each of the remaining chars:
// if the current word is a complete valid word, you can output a space
if(isValidWord(currentWord))
{
// if there are no more remaining chars, output the anagram:
if(remainingChars.length == 0)
{
outputAnagram(partialAnagram);
}
else
{
// output a space and start a new word
generateAnagrams(partialAnagram + " ", "", remainingChars);
}
}
// for each of the chars in remainingChars, check if it can be
// added to currentWord, to produce a valid partial word (i.e.
// there is at least 1 word starting with these characters)
for(i = 0 to remainingChars.length - 1)
{
char c = remainingChars[i];
if(isValidPartialWord(currentWord + c)
{
generateAnagrams(partialAnagram + c, currentWord + c,
remainingChars.remove(i));
}
}
}
あなたが電流に対応トライでのノードを通過させることによって、さらに、このアルゴリズムを最適化することができ、この
よう
generateAnagrams("", "", "peanutbutter");
それを呼び出すことができ部分的に完成した単語だけでなく、currentWord
を文字列として渡します。これにより、あなたのisValidPartialWord
のチェックがさらに速くなります。
isValidWord
のチェックを変更することで、単語が前の単語出力と比較して昇順(より大きいまたは等しい)のアルファベット順になっている場合にのみtrueを返すように設定することができます。同じ単語の2つが出力されるケースをキャッチするために、最後に偽のための別のチェックが必要な場合もあります。
部分的な単語を使うのは良い考えだと思います。私はトライでそれを見ることができると思っています:部分的な単語で始まる単語があるかどうか確認してください。ありがとう。 – Ravi