题目
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
思路
- 利用递归的思想,将第一个字符依次与后面的字符交换,再对每个交换后的序列全排序
代码
import java.util.ArrayList;
import java.util.Collections;
public class Solution {
public ArrayList<String> Permutation(String str) {
char[] chars = str.toCharArray();
ArrayList<String> list = new ArrayList<>();
if(str != null && str.length() > 0){
PermutationCore(chars, 0, list);
Collections.sort(list);
}
return list;
}
public void PermutationCore(char[] chars, int i, ArrayList<String> list){
int length = chars.length - 1;
//如果只剩一个字符,判断此时的chars是否包含在了list中
if(i == length){
String str = String.valueOf(chars);
if(!list.contains(str))
list.add(str);
}
else{
//将第一个字符依次与后面的字符交换,再对每个交换后的序列全排序
for(int j = i; j <= length; j++){
swap(chars, i, j);
PermutationCore(chars, i+1, list);
//回到递归前的状态,不会影响外部的遍历顺序
swap(chars, i, j);
}
}
}
public void swap(char[] ch, int i, int j){
char temp = ch[i];
ch[i] = ch[j];
ch[j] = temp;
}
}