views:

46

answers:

2

I have alphabet array 24 character: "A B C D E F G H I J K L M N O P Q R S T U V W X"

I want collect all case with: 3 unique characters.

First case: ABC, DEF, GHI, JKL, MNO, PQR, STU, VWX

A: 
$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];
        }
    }
}

Hope I understood your question right. This one iterates over the alphabet in three loops and always skips the characters which are already used. Then I push the result to $result.

But better try the script with only five letters ;) Using alls strlen($alphabet) (don't wanna count now...) will need incredibly much memory.

(I am sure there is some hacky version which is faster than that, but this is most straightforward I think.)

nikic
This function not good if I want 4 characters or 12 characters set because "$alphabet[$i].$alphabet[$j].$alphabet[$k]"
B11002
sorry, thought you wanted to have triples of unique characters
nikic
+1  A: 

There's a 1:1 relationship between the permutations of the letters of the alphabet and your sets lists. Basically, once you have a permutation of the alphabet, you just have to call array_chunk to get the sets.

Now, 24! of anything (that is 620448401733239439360000) will never fit in memory (be it RAM or disk), so the best you can do is to generate a number n between 1 and 24! (the permutation number) and then generate such permutation. For this last step, see for example Generation of permutations following Lehmer and Howell and the papers there cited.

Artefacto
array_chunk only for the first case.I don't care memory problem. We can reduce 24 to 6 characters. Can you explain "generate a number n between 1 and 24! (the permutation number)" in php function?
B11002
@B11 If you can reduce to 6 characters, take a look at [`mt_rand`](http://www.php.net/mt_rand).
Artefacto
@B11 By the way, if you just want to generate all the permutations, there's are easier ways to do this... See e.g. [here](http://www.merriampark.com/perm.htm) for a listing in Java.
Artefacto
Thank you very much :)
B11002