pensamiento algoritmo (de forma recursiva) Formación: cadena de salida gama completa de caracteres

título

Diseñar un algoritmo, la salida de toda la disposición de una cadena de caracteres. Por ejemplo, String = "ABC" de salida es
ABC
ACB
BAC
BCA
la CBA
CAB

pensamiento

Nuestro primer impulso es posible, esto es una cuestión de elección, el primer carácter de 3-a-1, 2-a-1 segundo carácter, el tercer personaje no tenía otra opción, tres ciclos de violencia pueden ser resueltos rápidamente. bucles anidados se pueden utilizar para generar una nueva cadena.

Sin embargo, la longitud de esta cadena es incierto, no tenemos una sintaxis que se puede especificar el número de ciclos de capas.

operación si el número de capas que se basa, únicamente recursividad.

Una situación obligada x abstracto recursivo, de manera que la parte inferior de las simplifica situación procesamiento a Y, la situación recursiva solución y, y así sucesivamente, hasta que el problema es lo suficientemente simple para ser resuelto Claramente, a continuación, volver a las capas.

Cuando la repetición abstracta, podemos imaginar que tengo una filial o una filial de otra filial, todas estas personas pueden resolver el mismo problema. Los más altos dirigentes necesitan simplificar la situación un poco, a continuación, nombrado después de una situación similar a trato con subordinados puede simplificar esto, entonces está a la espera de los resultados.

En esta pregunta, podemos considerar esto:

    目标:输出全排列(字符数组)
        我来搞定第一个字符
        剩下的事,下级来处理剩下的部分
        处理到最后一个字符时,就可以输出这个重新排列过的数组了

Pero pronto se encuentra que el primer carácter para llegar hay muchas opciones, el razonamiento anterior necesita ser reescrita como:

    目标:输出全排列(字符数组)
        我来搞定第一个字符,这件事我会重复N次,每次选字符串中的一个
            一旦选定(把某个字符挪到首位)
            剩下的事,下级来处理剩下的部分
            因为下次我要再选一个,所以先恢复到挪位之前

Así que cuando la salida de la misma?
Esta función se llama una vez cada uno, están alineados delante de carácter superior, tengo que lidiar con los caracteres subsiguientes, si estoy tratando es el último carácter, porque los superiores se han alineado frente a mí todos los caracteres a la salida general.

pseudocódigo

// data:上级给任务时字符数组,index:上级已经排好了0~index-1的字符,要我处理index~length-1这段
f(char[] data,int index)
    // 现在我试着从index开始找一个字符来作为首位,我要尝试length-indexfor(int i=index;i<length;i++)
        swap(data,i,index);// 把i位置的字符交换到index这里来,我的工作就完成了
        // 下面请直接下级来接招
        f(data,index+1);
        // 下级排好了,我即将选定下一个字符作为首位,必须先恢复一下
        swap(data,i,index);

    // 如果上级们已经处理好全部字符,我就输出
    if(index==length)
        println(data);

código Java

package org.lanqiao.algo.recursion;

/**
 * 输出字符串所有字符的全排列
 * */
public class StrPermutation {

  static int n;

  public static void main(String[] args) {
    String s = "ABCDE";
    permutation(s.toCharArray(), 0);
    System.out.println("---" + n + "---"); // n=长度的阶乘,可以用这个数字验证算法的正确性
  }


  //index代表0~index-1都已确认排列,[index,n-1]待排列
  private static void permutation(char[] arr, int index) {
    //至于什么时候输出,要考虑清楚
    //考虑:只有所有位置上的字符都确认即index到达末尾,才算是排好一种情况
    if (index == arr.length) {
      n++;
      System.out.println(String.valueOf(arr));
    }
    //现在index之前的字符都已就位,把之后的每个字符都交换到index这个位置
    for (int k = index; k < arr.length; k++) {
      //尝试交换
      swap(arr, index, k);
      //交换之后index这个位置就定好了,接下来的事就是递归去解决index+1位置开始的全排列就好了
      permutation(arr, index + 1);
      // 前面我们尝试交换,把全排列求出来了,交换时只尝试了一个字符,因此for循环继续之前要换回来,继续尝试交换下一个字符
      swap(arr, index, k);
    }
  }

  private static void swap(char[] arr, int index, int k) {
    if(k==index)
      return; // 不必交换了吧
    char tmp = arr[k];
    arr[k] = arr[index];
    arr[index] = tmp;
  }
}

resumen

El código final es en realidad relativamente corto, es funciones recursivas: el código es simple, la idea de desvío. Prueba del pensamiento abstracto y la imaginación.
Recursiva, debe encontrar el problema similitud en sub-problemas, en otras palabras, usted tiene que encontrar algún tipo de estructura de descomposición se puede simplificar a la desintegración problema enlace directo hasta la conclusión.

Publicados 127 artículos originales · ganaron 97 Like · vistas 310 000 +

Supongo que te gusta

Origin blog.csdn.net/zhengwei223/article/details/78627003
Recomendado
Clasificación