字符串全排列

public class biroTest {

 

    public  static void permutation(char[] buf, int start, int end) {

        if (start == end) {// 当只要求对数组中一个字母进行全排列时,只要就按该数组输出即可

            for (int i = 0; i <= end; i++) {

                System.out.print(buf[i]);

            }

            System.out.println();

        } else {// 多个字母全排列

            for (int i = start; i <= end; i++) {

                char temp = buf[start];// 交换数组第一个元素与后续的元素

                buf[start] = buf[i];

                buf[i] = temp;

 

                permutation(buf, start + 1, end);// 后续元素递归全排列

 

                temp = buf[start];// 将交换后的数组还原

                buf[start] = buf[i];

                buf[i] = temp;

            }

        }

    }

 

    public static void main(String arg[]){

 

        char[] buf = new char[] { 'a', 'b', 'c'};

        permutation(buf, 0, 2);

 

    }

}

 

     用树的结构能够加强对这个递归的理解,但是如果一开始画的时候很容易将红色的b那个节点与右边a换掉。一开始看这种for循环,觉得很绕,尤其debug或者自己慢慢逐个语句查看的时候,很容易被for循环绕晕,尤其当字符串为abcd或者更大的时候。先对这个递归进行整体的介绍,分3步:1交换,2递归,3恢复。其中第3步很容易被忽略掉,在每个递归返回时候,需要恢复递归调用前的状态。出口是游标都指到字符串最后一个元素(即到了图的叶子节点)

 

 

      每输出一组,就要恢复一下(跳出for循环),例如第一组abc,恢复bc,之前都指向b的并没有交换,但事实上,代码上是走的,第二组输出的时候cb,恢复至bc,此时buf为abc(此次恢复实际上跳出一层for循环);然后开始a和b交换,即bac;依次类推,到第4组的时候输出bca,先恢复ac,即buf为bac,然后再恢复至abc(跳出一层for循环),接着交换成cba

 

如果字符串为abcd时候,和这个类似(大问题划分成小问题,整体上还是3步:1.交换,2:递归,3:恢复),先po结果abcd

abdc

acbd

acdb

adcb

adbc

-------------

bacd

badc

bcad

bcda

bdca

bdac

-------------

cbad

cbda

cabd

cadb

cdab

cdba

--------------

dbca

dbac

dcba

dcab

dacb

dabc

 

每一组相当于之前的3个字符串,在之前3层树的基础上往上再画一层。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值