アルファベット配列24文字があります: "ABCDEFGHIJKLMNOPQRSTU VW X"
すべてのケースを次のように収集したい:3つのユニークな文字。
最初のケース:ABC、DEF、GHI、JKL、MNO、PQR、STU、VWX
これは少し遅れていますが、これを読んでいる他の人のために:文字列を3文字のチャンクに分割したい場合は、PHPの組み込みstr_split()関数を試してください。$string
と$split_length
引数を取ります。例えば:
$alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWX';
$grouped = str_split($alphabet, 3);
var_export( $grouped );
これにより、次の配列が出力されます。
array ( 0 => 'ABC', 1 => 'DEF', 2 => 'GHI',
3 => 'JKL', 4 => 'MNO', 5 => 'PQR',
6 => 'STU', 7 => 'VWX', )
これは、質問で与えられた例で機能します。これらの24文字の可能なすべての組み合わせが必要な場合は、Artefactoの答えの方が理にかなっています。
$alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$c = strlen($alphabet);
$result = array();
for ($i = 0; $i < $c; ++$i) {
$current0 = $i;
for ($j = 0; $j < $c; ++$j) {
if ($current0 == $j) continue;
$current1 = $j;
for ($k = 0; $k < $c; ++$k) {
if (isset($current0 == $k || $current1 == $k)) continue;
$result[] = $alphabet[$i].$alphabet[$j].$alphabet[$k];
}
}
}
私があなたの質問を正しく理解したことを願っています。これは3つのループでアルファベットを繰り返し、すでに使用されている文字を常にスキップします。次に、結果を$resultにプッシュします。
ただし、5文字だけのスクリプトを試してみてください;)alls strlen($ alphabet)(今は数えたくない...)を使用すると、非常に多くのメモリが必要になります。
(それよりも速いハッキーなバージョンがあると確信していますが、これは私が思うに最も簡単です。)
アルファベットの文字の順列とセットリストの間には1:1の関係があります。array_chunk
基本的に、アルファベットの順列を取得したら、セットを取得するために呼び出す必要があります。
今、24!何でも(つまり、620448401733239439360000)メモリ(RAMまたはディスク)に収まらないため、と(順列番号)のn
間の数値を生成してから、そのような順列を生成するのが最善の方法です。この最後のステップについては、たとえば、LehmerとHowellに続く順列の生成、およびそこで引用されている論文を参照してください。1
24!