编写一个方法,确定某字符串的所有排列组合。
给定一个string A和一个int n,代表字符串和其长度,请返回所有该字符串字符的排列,保证字符串长度小于等于11且字符串中字符均为大写英文字符,排列中的字符串按字典序从大到小排序。(不合并重复字符串)
测试样例:
"ABC"
返回:[“CBA”,"CAB","BCA","BAC","ACB","ABC"]
/*designed by wyq*/
import java.util.*;
import java.util.Comparator;
public class Permutation {
public ArrayList<String> getPermutation(String A) {
ArrayList<String> list = new ArrayList<String>();
if(A==null||A.length()<=1){//合法性检测
list.add(A);
return list;
}
StringBuffer sb = new StringBuffer(A);
Permutation(sb,0,A.length(),list);
Comparator<String> comp = new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o2.compareTo(o1);
}
};
Collections.sort(list, comp);
for(String s:list){
System.out.println(s);
}
return list;
}
/*全排列:将第一位依次与后面的交换
123
123 132
213 231
321 312
*/
public void Permutation(StringBuffer A,int start,int end,ArrayList<String> list) {
if(start==end-1){
list.add(A.toString());
}else{
for(int i=start;i<end;i++){
char temp = A.charAt(start);
char c = A.charAt(i);
//如果去除重复的字符串 就在 位置不等,字符相等时不交换
// if(i!=start&&temp==c){
// continue;
// }
A.setCharAt(start, c);//将第一位与后面的交换
A.setCharAt(i, temp);
Permutation(A,start+1,end,list);
A.setCharAt(start, temp);//恢复状态以便后面的继续调用
A.setCharAt(i, c);
}
}
}
}