剑指 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;
}
}