0

アルファベット配列24文字があります: "ABCDEFGHIJKLMNOPQRSTU VW X"

すべてのケースを次のように収集したい:3つのユニークな文字。

最初のケース:ABC、DEF、GHI、JKL、MNO、PQR、STU、VWX

4

3 に答える 3

1

これは少し遅れていますが、これを読んでいる他の人のために:文字列を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の答えの方が理にかなっています。

于 2015-02-18T19:30:13.803 に答える
0
$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)(今は数えたくない...)を使用すると、非常に多くのメモリが必要になります。

(それよりも速いハッキーなバージョンがあると確信していますが、これは私が思うに最も簡単です。)

于 2010-07-10T15:16:31.143 に答える
0

アルファベットの文字の順列とセットリストの間には1:1の関係があります。array_chunk基本的に、アルファベットの順列を取得したら、セットを取得するために呼び出す必要があります。

今、24!何でも(つまり、620448401733239439360000)メモリ(RAMまたはディスク)に収まらないため、と(順列番号)のn間の数値を生成してから、そのような順列を生成するのが最善の方法です。この最後のステップについては、たとえば、LehmerとHowellに続く順列の生成、およびそこで引用されている論文を参照してください。124!

于 2010-07-10T15:18:13.917 に答える