昨晚遇到的题目,想了半天想不出来,看了智商少的可怜0.0.。。
给定一个字符串,输出它的所有排列(不包括重复)
abc abc acb bac bca cba cab --like this.
今天花了一上午的时间从网上搜索答案,想把它搞懂,但是看了很多算法的描述。。。
只把递归这个搞懂了
每次交换不同的字符串,实现所有排列
下面是java的代码实现
:
public class StringSort {
public static void main(String[] args) {
char[] buf = {'a', 'b', 'c', 'd'}; //用字符数组存放给定字符串
perm(buf, 0, buf.length - 1);//调用静态方法,输出所有排列
}
public static void perm(char[] buf, int start, int end) {
if (start == 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; // 这三行用于交换字符串,例如,第一次a 和a交换不变
//进入递归buf[1] 和buf[end]交换,最后一次递归打印
perm(buf, start + 1, end);
temp = buf[start]; //
buf[start] = buf[i]; //
buf[i] = temp; //这三行用于还原之前交换了的字符串,到下一次循环是重新交换
} //
}
}
}
直接看可能看不懂,建议把代码自己敲一遍,然后把递归的图画出来,就理解了