1.题目描述
输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,输出abc,acb,bac,bca,cab和cba
2.问题分析
这个问题我们一开始看起来会比较困难,但是如果仔细分析一下排列的实质,或许很快会有思路。我们来看排列的实质,字符串的abc第一个字符分别与后边的字符(含自己)交换可以得到abc,bac,cba,然后对这每一个字符串从第二个字符分别与后边的字符(含自己)交换可以得到abc,acb,bac,bca,cba,cab,依此下去,最后就输出了abc,acb,bac,bca,cab和cba。那么这个问题如果我们按照这个思路来做的话,必然就是递归+回溯。
3.代码实现
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String str=sc.nextLine();
int n=str.length();
char[] arr=new char[n];
for(int i=0;i
4.问题扩展
如果字符串中存在重复字符呢?明显上述代码就不成立了,为什么呢?如果有重复字符,与相同字符的交换输出结果必定有重复,所以我们对于相同的字符应该只交换一次,实际上我们可以增加一个数组,记录与当前位置字符交换过的字符,每次交换前都要进行判断,如果要交换的字符已经不存在该数组,才进行交换。
改进的代码:
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String str=sc.nextLine();
int n=str.length();
char[] arr=new char[n];
for(int i=0;i
输入:accc
输出:accc
cacc
ccac
ccca