Combinação de letras

6 respostas
C

Pessoal, boa tarde.
Alguém já postou aqui no fórum alguma pergunta refere a análise combinatória com letras?
Ex.: o usuário digita uma sequência de letras tipo ABCDEA e o nº de sequencias que ele quer tipo 24 combinações diferentes. É possível fazer um assim e como?

6 Respostas

C
Eu tenho este código

public static void main(String[] args){

String[] arr = {A,B,C,D,E};

combinations2(arr, 3, 0, new String[5]);

}
static void combinations2(String[] arr, int len, int startPosition, String[] result){
        if (len == 0){
            System.out.println(Arrays.toString(result));
            return;
        }       
        for (int i = startPosition; i <= arr.length-len; i++){
            result[result.length - len] = arr[i];
            combinations2(arr, len-1, i+1, result);
        }
    }

Ele gera essas combinações:
[A, B, C]
[A, B, D]
[A, B, E]
[A, C, D]
[A, C, E]
[A, D, E]
[B, C, D]
[B, C, E]
[B, D, E]
[C, D, E]

Eu queria que a partir de um nº digitado pelo usuário, ex.: 12 ele gerasse 12 combinações diferentes.
ABCDEA
AEDCBA

Jelson1

Você pode adicionar um contador, para ir contabilizando as combinações geradas. Fiz essa alteração adicionados mais dois parâmetros (count e total) para a função combination2. Esse algoritmo vai pegar sempre as N primeiras combinações se possível.

import java.util.*;

public class Main {
    
    public static void main(String[] args) {
        String[] arr = {"A","B","C","D","E"};
        combinations2(arr, 3, 0, new String[3], 4, 0);
    }

    private static int combinations2(String[] arr, int len, 
        int startPosition, String[] result, int total, int count)
    
    {
        if(count >= total) return count; //finaliza;
        
        if (len == 0){
            System.out.println(Arrays.toString(result));
            count++; // mais uma combinação
            
            return count;
        }
        
        for (int i = startPosition; i <= arr.length-len; i++){
            result[result.length - len] = arr[i];
            
            count = combinations2(
                arr, len-1, i+1, result,
                total, count
            );
            
            if(count >= total) return count; // encerra o algoritmo
        }
        
        return count;
    }
}

Outra solução é criar uma variável global como contador!

C

Valeu mais uma dúvida. Suponhamos que eu aumente o array [6] e len também para 6 com o mesmo total por que só tenho uma combinação? Para aumentar para 12 combinações por exemplo, seria como?
[B, A, C, D, E, B]

Jelson1

Esse algoritmo faz uma combinação, ou seja combinação de 6 elementos agrupados em 6:
C6,6 = 6! / (!6 • (6 - 6)!) = 6! / (6! • 0!) = 1

Como pode ver só existe uma combinação, talvez o que você tem em mente seja uma permutação!

C

Essa fórmula: (n-1)!/2 seria permutação?

Jelson1

Eu desconheço essa fórmula. A fórmula de uma permutaçao simple é:
Pn = n!

Se você quer um algoritmo que gere todas as permutacões de uma palavra, tem esse site aqui:

Criado 28 de novembro de 2020
Ultima resposta 2 de dez. de 2020
Respostas 6
Participantes 2