Generar todas las contraseñas del conjunto de caracteres dado

Dado un conjunto de caracteres, genera todas las contraseñas posibles a partir de ellos. Esto significa que debemos generar todas las permutaciones posibles de palabras usando los caracteres dados, con repeticiones y también hasta una longitud determinada. 
Ejemplos: 
 

Input : arr[] = {a, b}, 
          len = 2.
Output :
a b aa ab ba bb

La solución es usar la recursión en la array de caracteres dada. La idea es pasar todas las longitudes posibles y una string vacía inicialmente a una función auxiliar. En la función auxiliar, seguimos agregando todos los caracteres uno por uno a la string actual y recurrimos para llenar la string restante hasta alcanzar la longitud deseada.
Se puede visualizar mejor utilizando el siguiente árbol de recursión:
 

        (a, b)
         /   \
        a     b
       / \   / \
      aa  ab ba bb

A continuación se muestra la implementación del método anterior.
 

C++

// C++ program to generate all passwords for given characters
#include <bits/stdc++.h>
using namespace std;
 
// int cnt;
 
// Recursive helper function, adds/removes characters
// until len is reached
void generate(char* arr, int i, string s, int len)
{
    // base case
    if (i == 0) // when len has been reached
    {
        // print it out
        cout << s << "\n";
        // cnt++;
        return;
    }
 
    // iterate through the array
    for (int j = 0; j < len; j++) {
 
        // Create new string with next character
        // Call generate again until string has
        // reached its len
        string appended = s + arr[j];
        generate(arr, i - 1, appended, len);
    }
 
    return;
}
 
// function to generate all possible passwords
void crack(char* arr, int len)
{
    // call for all required lengths
    for (int i = 1; i <= len; i++) {
        generate(arr, i, "", len);
    }
}
 
// driver function
int main()
{
    char arr[] = { 'a', 'b', 'c' };
    int len = sizeof(arr) / sizeof(arr[0]);
    crack(arr, len);
 
    //cout << cnt << endl;
    return 0;
}
// This code is contributed by Satish Srinivas.

Java

// Java program to generate all passwords for given characters
import java.util.*;
 
class GFG
{
 
    // int cnt;
    // Recursive helper function, adds/removes characters
    // until len is reached
    static void generate(char[] arr, int i, String s, int len)
    {
        // base case
        if (i == 0) // when len has been reached
        {
            // print it out
            System.out.println(s);
             
            // cnt++;
            return;
        }
 
        // iterate through the array
        for (int j = 0; j < len; j++)
        {
 
            // Create new string with next character
            // Call generate again until string has
            // reached its len
            String appended = s + arr[j];
            generate(arr, i - 1, appended, len);
        }
 
        return;
    }
 
    // function to generate all possible passwords
    static void crack(char[] arr, int len)
    {
        // call for all required lengths
        for (int i = 1; i <= len; i++)
        {
            generate(arr, i, "", len);
        }
    }
 
    // Driver code
    public static void main(String[] args)
    {
        char arr[] = {'a', 'b', 'c'};
        int len = arr.length;
        crack(arr, len);
    }
 
}
 
// This code has been contributed by 29AjayKumar

Python 3

# Python3 program to
# generate all passwords
# for given characters
 
# Recursive helper function,
# adds/removes characters
# until len is reached
def generate(arr, i, s, len):
 
    # base case
    if (i == 0): # when len has
                 # been reached
     
        # print it out
        print(s)
        return
     
    # iterate through the array
    for j in range(0, len):
 
        # Create new string with
        # next character Call
        # generate again until
        # string has reached its len
        appended = s + arr[j]
        generate(arr, i - 1, appended, len)
 
    return
 
# function to generate
# all possible passwords
def crack(arr, len):
 
    # call for all required lengths
    for i in range(1 , len + 1):
        generate(arr, i, "", len)
     
# Driver Code
arr = ['a', 'b', 'c' ]
len = len(arr)
crack(arr, len)
 
# This code is contributed by Smita.

C#

// C# program to generate all passwords for given characters
using System;
     
class GFG
{
 
    // int cnt;
    // Recursive helper function, adds/removes characters
    // until len is reached
    static void generate(char[] arr, int i, String s, int len)
    {
        // base case
        if (i == 0) // when len has been reached
        {
            // print it out
            Console.WriteLine(s);
             
            // cnt++;
            return;
        }
 
        // iterate through the array
        for (int j = 0; j < len; j++)
        {
 
            // Create new string with next character
            // Call generate again until string has
            // reached its len
            String appended = s + arr[j];
            generate(arr, i - 1, appended, len);
        }
 
        return;
    }
 
    // function to generate all possible passwords
    static void crack(char[] arr, int len)
    {
        // call for all required lengths
        for (int i = 1; i <= len; i++)
        {
            generate(arr, i, "", len);
        }
    }
 
    // Driver code
    public static void Main(String[] args)
    {
        char []arr = {'a', 'b', 'c'};
        int len = arr.Length;
        crack(arr, len);
    }
 
}
 
/* This code contributed by PrinciRaj1992 */

Javascript

<script>
// JavaScript program to generate all passwords for given characters
 
    // let cnt;
    // Recursive helper function, adds/removes characters
    // until len is reached
    function generate(arr, i, s, len)
    {
        // base case
        if (i == 0) // when len has been reached
        {
            // print it out
            document.write(s + "<br/>");
               
            // cnt++;
            return;
        }
   
        // iterate through the array
        for (let j = 0; j < len; j++)
        {
   
            // Create new string with next character
            // Call generate again until string has
            // reached its len
            let appended = s + arr[j];
            generate(arr, i - 1, appended, len);
        }
   
        return;
    }
   
    // function to generate all possible passwords
    function crack(arr, len)
    {
        // call for all required lengths
        for (let i = 1; i <= len; i++)
        {
            generate(arr, i, "", len);
        }
    }
 
  
// Driver Code
 
        let arr = ['a', 'b', 'c'];
        let len = arr.length;
        crack(arr, len);
                 
</script>

Producción: 
 

a
b
c
aa
ab
ac
ba
bb
bc
ca
cb
cc
aaa
aab
aac
aba
abb
abc
aca
acb
acc
baa
bab
bac
bba
bbb
bbc
bca
bcb
bcc
caa
cab
cac
cba
cbb
cbc
cca
ccb
ccc

Si queremos ver el recuento de palabras, podemos descomentar las líneas que tienen la variable cnt en el código. Podemos observar que resulta ser  n^1 + n^2 +..+ n^n   , donde n = len. Por lo tanto, la complejidad temporal del programa también es    , por lo tanto, exponencial. También podemos verificar una contraseña en particular 
mientras se genera y romper el ciclo y regresar si se encuentra. También podemos incluir otros símbolos para que se generen y, si es necesario, eliminar los duplicados al preprocesar la entrada usando una HashTable.
Este artículo es una contribución de Satish Srinivas . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.orgo envíe su artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *