剑指 Offer 38. 字符串的排列

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

 

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

 

示例:

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

 

class Solution {
    List<String>ans = new LinkedList<>();
    char[] c;
    public String[] permutation(String s) {
        c = s.toCharArray();
        dfs(0);
        return ans.toArray(new String[ans.size()]);
    }
    
    public void dfs(int x)
    {
        //base case
        if(x == c.length-1)
        {
            ans.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);
            dfs(x+1);
            swap(i,x);//回溯
        }
    }
    
    public void swap(int i,int j)
    {
        char temp = c[i];
        c[i] = c[j];
        c[j] = temp;
    }
}

 

上一篇:collection集合——List(ArrayList、LinkList、Vector)、Set(HashSet、TreeSet)


下一篇:hashCode() 和 HashSet, compareTo() 和 TreeSet