Pergunta

Eu tenho uma matriz alfabética de 24 caracteres:"A B C D E F G H I J K L M N O P Q R S T U V W X"

Quero coletar todos os casos com:3 personagens únicos.

Primeiro caso:ABC, DEF, GHI, JKL, MNO, PQR, STU, VWX

Foi útil?

Solução

Há uma relação de 1:1 entre as permutações das letras do alfabeto e suas listas de conjuntos.Basicamente, uma vez que você tenha uma permutação do alfabeto, basta ligar array_chunk para obter os conjuntos.

Agora, 24!de qualquer coisa (isto é 620448401733239439360000) nunca caberá na memória (seja RAM ou disco), então o melhor que você pode fazer é gerar um número n entre 1 e 24! (o número de permutação) e então gerar tal permutação.Para esta última etapa, veja por exemplo Geração de permutações seguindo Lehmer e Howell e os artigos ali citados.

Outras dicas

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

Espero ter entendido sua pergunta corretamente.Este itera sobre o alfabeto em três loops e sempre pula os caracteres que já estão em uso.Então eu empurro o resultado para $resultado.

Mas é melhor tentar o script com apenas cinco letras;) Usar alls strlen($alphabet) (não quero contar agora...) precisará de muita memória.

(Tenho certeza de que existe alguma versão hacky que é mais rápida que isso, mas acho que é mais simples.)

Isso está um pouco atrasado, mas para qualquer outra pessoa que esteja lendo isso:Se você deseja dividir uma string em pedaços de 3 caracteres, experimente o PHP integrado str_split() função.Leva em um $string e $split_length argumento.Por exemplo:

$alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWX';
$grouped  = str_split($alphabet, 3);

var_export( $grouped );

Isso gera a seguinte matriz:

array ( 0 => 'ABC', 1 => 'DEF', 2 => 'GHI', 
        3 => 'JKL', 4 => 'MNO', 5 => 'PQR', 
        6 => 'STU', 7 => 'VWX', )

Isso funciona para o exemplo dado na pergunta.Se você quiser ter todas as combinações possíveis dessas 24 letras, a resposta do Artefacto faz mais sentido.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top