Cómo imprimir todas las permutaciones de una cadena tanto de forma iterativa como recursiva

Una de las soluciones no recursivas tiene la siguiente lógica: la lógica para la solución no recursiva es la siguiente:

  1. Lo primero que debe hacer es ordenar la cadena dada en orden ascendente, que es la primera permutación, así que imprímala.
  2. Ahora tenemos que generar todas las otras permutaciones hasta que la cadena se ordene en orden descendente. Esa se convierte en la última permutación que se imprime y señala el final del programa.
  3. Para cada permutación, la permutación previa se convierte en el punto de partida y desde allí los pasos son:
  • Encuentra el carácter más a la derecha en la cadena que es más pequeña que el siguiente carácter. Como exp. Si String es BCDA, entonces necesita escanear a través de los caracteres, B es más pequeño que el siguiente carácter ‘C’, pero recuerde que debe encontrar el carácter más a la derecha y ‘C’ también es más pequeño que el siguiente carácter ‘D’ que significa ‘C ‘es el char que estás buscando. Llamemos a este char como ‘CHAR1’.
  • El segundo paso es encontrar el techo del ‘CHAR1’ a partir del índice del ‘CHAR1’, el techo aquí significa que a partir del índice del ‘CHAR1’ debe encontrar el carácter más pequeño que sea mayor que el ‘CHAR1’. Llamemos a este char como ‘CHAR2’. Como exp. Si la cadena es BCDAE y C es ‘CHAR1’, entonces está buscando el carácter más pequeño en la cadena “DAE” que es mayor que C. Por lo tanto, debería ser D, entonces D es ‘CHAR2’ en este caso.
  • Intercambie estos 2 caracteres encontrados usando Step1 y Step2, es decir, CHAR1 y CHAR2.
  • En la cadena resultante, tome la subcadena después del índice de ‘CHAR1’ hasta el final y ordénela.

Código para la lógica – http://netjs.blogspot.com/2016/0…

Una posible implementación de pseudocódigo vendrá más tarde, pero la idea general detrás de mi pensamiento:

Supongamos que tiene una Cadena “1234”, y para imprimir todas las permutaciones, haga algo como:

printAllP donde 1 es el primer carácter, candidatos = {2,3,4};
printAllP donde 2 es el primer carácter, candidatos = {1,3,4};
printAllP donde 3 es el primer carácter, candidatos = {1,2,4};
printAllP donde 4 es el primer carácter, candidatos = {1,2,3};

Donde “printAllP” es una función mágica que imprime todas las posibles permutaciones de la cadena que satisfacen la condición dada, y los candidatos son la lista de caracteres que aún deben imprimirse. En el caso de “printAllP donde 1 es el primer carácter”, eliminamos 1 de la lista de “candidatos” y continuamos, ahora esa llamada se transformará en

printAllP donde 1 es el primer carácter =
printAllP donde 1 es el primer carácter, 2 es el segundo carácter, candidatos = {3,4};
printAllP donde 1 es el primer carácter, 3 es el segundo carácter, candidatos = {2,4};
printAllP donde 1 es el primer carácter, 4 es el segundo carácter, candidatos = {2,3};

No importa la longitud de la cadena original, llegaremos a un caso base en el que solo quede un candidato, como

printAllP donde 1 es el primer carácter, 2 es el segundo carácter, 3 es el tercer carácter, candidatos = {4}

que puede reducirse a una declaración impresa, print (1234)

Mirando hacia atrás en los conceptos, creo que esta es una implementación recursiva / iterativa (perdona mi acento de Java):

void printAllP (Cadena s, candidatos de char [])
{
if candidatos.size == 1
{
print (s + candidatos [0])
}
más
{
para i = 1, candidatos.longitud
{
char [] copia = candidatos.clone ()
char especial = candidatos [i]
eliminar el elemento i de la copia
printAllP (s + especial, copia)
}
}
}

y la primera llamada sería printAllP (“”, new char [] {‘1’, ‘2’, ‘3’, ‘4’}) para referirse a mi ejemplo anterior.

La permutación de una cadena es una buena pregunta de entrevista y también un buen problema de programación. Puede consultar este enlace para obtener ayuda.
Generar permutación de cadena