分析:提取首字母,然后对首字母后面的字符进行递归操作即可。
我的代码:
import java.util.*;
public class Permutation {
public ArrayList<String> getPermutation(String A) {
// write code here
if(A==null){
return null;
}
ArrayList<String> per = new ArrayList<String>();
if(A.length()==0){
per.add("");
return per;
}
char first = A.charAt(0);//提取首字母
String remainer = A.substring(1);//提取首字母后面的字符串
ArrayList<String> words = getPermutation(remainer);//后面的字符串进行递归。
for(String word:words){//首字母各个位置插入
for(int i = 0;i<=word.length();i++){
String s = insertCharAt(word,first,i);
per.add(s);
}
}
Collections.sort(per);//升序排列
Collections.reverse(per);//反转
return per;
}
public String insertCharAt(String word,char c,int i ){//插入
String start = word.substring(0,i);
String end = word.substring(i);
return start+c+end;
}
}
代码下载:我的github
还有一个解法:
import java.util.*;
public class Permutation {
public ArrayList<String> getPermutation(String A) {
// write code here
ArrayList<String> list = new ArrayList<>();
permutation(list, A.toCharArray(), 0);
Collections.sort(list);
Collections.reverse(list);
return list;
}
public void permutation(ArrayList<String> list, char[] array, int k) {
if(k == array.length) {
list.add(new String(array));
return ;
}
for(int i = k; i < array.length; i++) {//以首字母不同来分组
swap(array, i, k);//将k位置和i位置的字母交换
permutation(list, array, k + 1);//i字母后面的进行组合的获取
swap(array, i, k);//交换回来,维持稳定
}
}
public void swap(char[] array, int i, int j) {
if(i != j) {
char temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}