1

単語を含む文字列があるとしましょう:
1 2 3 4 5

3 つの単語のすべての組み合わせが必要ですが、順序は変更できません。文字列の長さは 4 語から 7 語までです。組み合わせが多すぎるため、長くはありません。したがって、例 1 2 3 4 5 の結果は文字列の配列になります:
1 2 3
1 2 4
1 2 5
1 3 4
1 3 5
1 4 5
2 3 4
2 3 5
2 4 5
3 4 5

私はしばらくこれについて考えてきました。1 つのアイデアは、それを配列に変換し、単語数のバイナリ コードを生成し、それが 1 の場合は単語を表示し、そうでない場合は表示しません (つまり、11100 から 00111 までの値を取得します)。しかし、それはおそらく最適ではありません。

この場合、数分以内に何万回も実行する必要があるため、速度が重要です。

4

2 に答える 2

1

私はヴィッキーの答えを使用し、いくつかの変更を加えました。これはあなたが望むように機能すると思います

function everyCombination($array) {
    $tempcount = 3;                            //lenght of the combinations you want
    $arrayCount      = count($array);
    $maxCombinations = pow($arrayCount, $arrayCount);
    $returnArray     = array();
    $conversionArray = array();
    foreach ($array as $key => $value) {
        $conversionArray[base_convert($key, 10, $arrayCount)] = $value;
    }
    for ($i = 0; $i < $maxCombinations; $i++) {
        $flag = 1;
        $combination = base_convert($i, 10, $arrayCount);
        $combination = str_pad($combination, $tempcount, "0", STR_PAD_LEFT);
        $temp = strtr($combination, $conversionArray);
        for($j = 0; $j < $tempcount-1; $j++){

            if($temp[$j] >= $temp[$j+1] || $flag == 0)
                $flag = 0;
            else
                $flag = 1;
        }
        if($flag && strlen($temp) == $tempcount)
            $returnArray[] = $temp;
    }
    return $returnArray;
}

print_r(everyCombination(array(1,2,3,4)));
于 2013-11-08T06:07:00.663 に答える