有重複字符串的排列組合

有重複字符串的排列組合。編寫一種方法,計算某字符串的所有排列組合。

示例1:

輸入:S = “qqe”
輸出:[“eqq”,“qeq”,“qqe”]
示例2:

輸入:S = “ab”
輸出:[“ab”, “ba”]
提示:

字符都是英文字母。
字符串長度在[1, 9]之間。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/permutation-ii-lcci
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

利用回溯+剪枝算法來求解:

class Solution {
    
    private List<String> res = new ArrayList<>();
    //標記已經使用過的字符
    private int[] temp;
  
    public String[] permutation(String S) {
        if(S == null){
            return null;
        }
        char[] arr = S.toCharArray();
        //先排序
        xz(arr);
        S= String.valueOf(arr);
        temp = new int[S.length()];
        dg(S, 0 , "", res);
        String[] returnArr = new String [res.size()];
        for (int i = 0; i < returnArr.length; i++) {
            returnArr[i] = res.get(i);
        }
        return returnArr;
    }
    private void dg(String s, int index ,String p, List<String> res){
        if(index == s.length()){
            res.add(p);
            return;
        }
        /**for循環控制s的每個字符,可以這麼理解,比如aab,
        我們可以理解成a0,a1,b2,其中0,1,2是每個字符的下標
        這樣有助於我們畫樹形圖理解。
*/
        for(int i = 0; i < s.length(); i ++){
        	//沒有使用過
            if (temp[i] != 1){
              /**
              這裏進行了剪枝,判斷是否在同一層並且是否相等,這裏有個問題
              temp[i - 1] == 1時也是可以解答出來的,所以我一臉矇蔽,不知
              道有哪位大神可以解答下。
              */
                if (i > 0 && s.charAt(i) == s.charAt(i -1) && temp[i - 1] == 0 ){
                    continue;
                }
                p = p + s.charAt(i);
                temp[i] = 1;
                //遞歸
                dg(s, index + 1 , p, res);
                //怎麼樣設置的遞歸完怎麼回去,dfs的回退的重點所在
                p = p.substring(0, p.length() - 1);
                temp[i] = 0;
            }

        }
        return;
    }
    public static void xz(char[] chs){
        for(int i = 0; i < chs.length-1; i++){
            for(int j = i+1; j<chs.length; j++){
                if(chs[j] < chs[i]){
                    char temp = chs[j];
                    chs[j] = chs[i];
                    chs[i] = temp;
                }
            }
        }
    }

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