38.字符串的排列

面试题38. 字符串的排列

难度中等38

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

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

示例:

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

回溯

//dfs  time :O(N!)  space  : O(N^2)
    List<String> ret = new LinkedList<>();
    char [] ch;
    public String[] permutation(String s) {
        if(s == null){
            return new String[0];
        }
        ch = s.toCharArray();
        dfs(0);
        return ret.toArray(new String[ret.size()]);
    }

    private void dfs(int x){
        //终止条件
        if(x == ch.length-1){
            ret.add(String.valueOf(ch));
            return;
        }
        HashSet<Character> hashSet = new HashSet<>();
        
        for(int i=x;i<ch.length;i++){
            //去重 -》剪枝操作
            if(hashSet.contains(ch[i]))  continue;
            hashSet.add(ch[i]);
            //交换
            swap(i,x);
            dfs(x+1);
            //撤回交换
            swap(x,i);
        }
    }

    private void swap(int x,int i){
        char tmp = ch[x];
        ch[x] = ch[i];
        ch[i] = tmp;
    }