您的位置:首页 > 其它

字符串全排列

2016-01-14 14:37 344 查看
先贴代码

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层树的基础上往上再画一层。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: