a为固定位,b依次与b、c、d进行交换;上图只展示了b与自身、c交换的过程,其他情况同理
ArrayList<String> arrayList = new ArrayList<String>();
public ArrayList<String> Permutation(String str) {
StringBuilder str2= new StringBuilder(str); //以StringBuilder的形式存储str,方便后面的swap和存储到arraylist中
permute(str2,0);
ArrayList<String> arrayList2=new ArrayList<String>(); //只保留不重复的字符串
for(int i=0;i<arrayList.size();i++){
if(!arrayList2.contains(arrayList.get(i)))
arrayList2.add(arrayList.get(i));
}
Collections.sort(arrayList2); //题目要求排序
return arrayList2;
}
void permute(StringBuilder temp,int pos){
//pos表明从pos位置开始与后面的每一个字符进行swap
if(pos==temp.length()){ //到了字符串的最后一个字符,后面没有可以swap的字符了,就把当前的字符串存储起来
arrayList.add(temp.toString());
return;
}
else {
for(int i=pos;i<temp.length();i++){ //i=pos,从pos位置开始与后面每一个字符(包括自身)进行swap
char c;
if(pos!=i){
c = temp.charAt(i);
temp.setCharAt(i, temp.charAt(pos));
temp.setCharAt(pos,c);
} //swap操作
permute(temp,pos+1);//pos位置后面的sub String进行递归的permute操作
if(pos!=i){ //把swap过的字符串进行复位,不影响后续的操作
c = temp.charAt(i);
temp.setCharAt(i, temp.charAt(pos));
temp.setCharAt(pos,c);
}
}
}
}