単語リストから考えられるすべてのパングラムを生成する最も簡単な方法は、リストから考えられるすべての単語の組み合わせを生成し、それぞれについて、それがパングラムかどうかを確認することです。チェックを行うには、文字列を調べて、文字列内の各文字の bool を true に設定します。最後に、bools がすべて true に設定されている場合はパングラムです。
より効率的な方法は、おそらく各単語を調べて、単語の長さと一緒に bool の配列 (または 32 ビット int などのビットのセット) を設定することです。次に、26 ビットすべてが設定された値を生成する OR 演算されたビットを見つけることができ、パングラムが得られます。
パングラムをまとめるときに、境界チェックを追加できます。単語を追加すると潜在的なパングラムが現在の最短のパングラム (存在する場合) よりも長くなる場合は、そのチェックをその場で停止します。単語を長さで並べ替えることから始めた場合、より長い組み合わせを見つけた瞬間に、その一連の試行をすべてやめて、次の可能性に進むことができます。
さらに高度にしたい場合は、上記と同じ種類のビット セットを作成することから始めることができます。次に、それらを取得し、ビットを合計して、最も少ない単語にどの文字が出現するかを判断します。潜在的なパングラムを生成し始めると、それらの単語のいずれかが含まれている必要があることがわかります。たとえば、上記のリストでは、「lazy」、「laziest」、および「crazy」だけが「z」を含むように見えるため、すべてのパングラムが必要であることがすぐにわかりますこれらの 3 つの単語のいずれかを含めます。それらのどれにも「q」は含まれておらず、「q」を含む唯一の単語は「速い」と「最も速い」であるように思われるため、(再び)すべてのパングラムにはこれら2つのうちの1つが含まれている必要があります(もちろん私は行きますここでは手作業で検査しているため、単語を見逃している可能性があります)。したがって、そのリストのすべての可能なパングラムには、(そして、最初から始めることもできます): (quick|quickest) (lazy|laziest|crazy) が含まれます。
単語リストの前処理を検討することもできます。他の単語より長いが、他の単語から欠落している文字が少なくとも 1 つ含まれていない単語は、すぐに削除できます。仮定の例として、"ab" と "abab" がある場合、"abab" が "ab" よりも短いパングラムになることは決してないことがわかっているので、すぐにリストから削除することもできます。