字符串全排列
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层树的基础上往上再画一层。
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层树的基础上往上再画一层。
相关文章推荐
- 高德LBS使用以及注意事项+debug版本直接用release的签名配置
- css中定位
- Google工程师打造Remix OS系统 桌面版安卓下载
- Power of Three
- java--生成图片验证码
- pod sepc说明文件写法
- CSS引入方式
- android实现qq侧滑
- Android 仿QQ联系人,分组悬浮,展开停至特定项
- [数据挖掘]数学基础---距离度量方式(马氏距离,欧式距离,曼哈顿距离)
- 浏览器能上网,qq,百度云不能上
- keepalived+mysql双主
- [leetcode] 287. Find the Duplicate Number 解题报告
- ios蓝牙开发(二)
- 测试工作——Web测试需要了解的内容
- iOS开发之事件传递响应链
- 学习笔记8: android stuido 如何获取SHA1数字签名,MD5信息
- C#使用post提交http请求
- 索引的创建和删除
- 如何借助windowns的VHD引导特性实现VHD多windows系统共存