題目描述
輸入一個字符串,按字典序打印出該字符串中字符的所有排列。例如輸入字符串abc,則打印出由字符a,b,c所能排列出來的所有字符串abc,acb,bac,bca,cab和cba。
輸入描述:
輸入一個字符串,長度不超過9(可能有字符重複),字符只包括大小寫字母。
遞歸:
遞歸的出口爲只剩最後一個字符的時候,然後進行字符數組的全排列,但是注意一點就是,出現重複字符時需要跳過(舉例,如aba:1位置與2位置交換後變爲baa,當1位置後續與3位置交換時因爲值一樣所以不進行替換但是其後續排列也被截掉了,這時後續的排列外層指針指向在b時b位置的與a交換爲abb,正好解決了外層指針在a時不能排列爲abb的情況)
import java.util.*;
public class Solution {
public ArrayList<String> Permutation(String str) {
ArrayList list = new ArrayList();
if(!str.isEmpty()){
getAllType(list,str.toCharArray(),0);
Collections.sort(list);
}
return list;
}
public void getAllType(ArrayList list , char[] chars,int index){
if(index == chars.length-1){ // 出口控制條件
list.add(String.valueOf(chars));
}else{ //進行全排列
Set<Character> set = new HashSet<Character>();
for(int j = index;j<chars.length;j++){
if(index==j||!set.contains(chars[j])){ // 按照上述思路循環內去除重複項干擾
set.add(chars[j]);
exchangeSub(chars,index,j);
getAllType(list,chars,index+1); // 剩餘位置全排列
exchangeSub(chars,j,index); // 該指針位置排列完後恢復原有接口,防止影響其他排列
}
}
}
}
public void exchangeSub(char[] chars , int i , int j){
char tem = chars[i];
chars[i] = chars[j];
chars[j] = tem;
}
}