算法學習之字符串的排列

題目描述

輸入一個字符串,按字典序打印出該字符串中字符的所有排列。例如輸入字符串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;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章