- 题目:输入一个字符串,按字典序打印出该字符串中字符的所有排列。
- 举例:输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
- 解题思路:基于回溯法思想
![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/12832081194889f76605ce70f1be5d63.png)
- 代码
/**
* 功能:输入一个字符串,按字典序打印出该字符串中字符的所有排列。
* 举例:字符串:abc, 则所有排列为:abc, acb, bac, bca, cab, cba.
* @version 1.0
* @date 2018/8/9
*/
public class StringPermutation {
public static void main(String[] args) {
ArrayList<String> a = Permutation("abc");
System.out.println(a.toString());
}
/**
* 返回该字符串中字符的所有排列
* @param str 字符串
*/
public static ArrayList<String> Permutation(String str) {
ArrayList<String> list = new ArrayList<>();
char[] cStr = str.toCharArray();
recursPermutation(list,cStr,0);
/**
* 按字典序排序
*/
Collections.sort(list);
return list;
}
/**
* 递归置换字符数组,并存储至ArrayList
* @param list
* @param cStr 当前字符数组
* @param fromIndex 开始索引
*/
public static void recursPermutation(ArrayList<String> list,char[] cStr,int fromIndex){
/**
* 终止递归的条件
*/
if(fromIndex==cStr.length-1){
String newString = String.valueOf(cStr);
if(!list.contains(newString)){
list.add(newString);
}
return;
}
for(int j=fromIndex;j<cStr.length;j++){
swap(cStr,fromIndex,j);
recursPermutation(list,cStr,fromIndex+1);
swap(cStr,fromIndex,j);
}
}
/**
* 交换cStr数组中索引为i和j的元素
* @param cStr
* @param i
* @param j
*/
public static void swap(char[] cStr,int i,int j){
char temp = cStr[i];
cStr[i] = cStr[j];
cStr[j] = temp;
}
}