【字符串】剑指 Offer 38. 字符串的排列 (递归) (难,再来一次)

题目:

输入一个字符串,打印出该字符串中字符的所有排列。

 

你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。

 

示例:

输入:s = "abc"
输出:["abc","acb","bac","bca","cab","cba"]
 

限制:

1 <= s 的长度 <= 8

解答:

方法一:(递归)

时间复杂度:O(n!)

空间复杂度:O(n!)

class Solution {

    List<String> res = new LinkedList<>();
    char c[];
    public String[] permutation(String s) {
        c = s.toCharArray();
        dfs(0);
        return res.toArray(new String[res.size()]);
    }

    void dfs(int x){
        if(x == c.length-1){
            res.add(String.valueOf(c));//添加新的排列方案
            return;
        }

        HashSet<Character> set = new HashSet<>();
        for(int i = x;i<c.length;i++){
            if(set.contains(c[i])) continue;//排列中有重复的字符,因此剪枝
            set.add(c[i]);  
            swap(i,x);      //交换,将c[i]固定在第x位
            dfs(x+1);       //开启固定第 x+1 位字符
            swap(i,x);      //恢复交换
        }
    }

    void swap(int a,int b){
        char tmp = c[a];
        c[a] = c[b];
        c[b] = tmp;
    }
}

 

posted @ 2020-08-14 11:46  3KBLACK  阅读(53)  评论(0)    收藏  举报