题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
实现:
由于字符数组等转换不好解决,与46区别看
List<String> res = new ArrayList<>();
char[] c;
public String[] permutation(String s) {
if (s == null || s.length() == 0) return new String[0];
c = s.toCharArray();
dfs(0);
return res.toArray(new String[res.size()]);
}
public void dfs(int index) {
if (index == c.length - 1) {
res.add(String.valueOf(c));
return;
}
HashSet<Character> set = new HashSet<>();
for (int i = index; i < c.length; i++) {
if (set.contains(c[i])) //也叫剪枝
continue;
set.add(c[i]);
swap(i, index); //固定第index位 如1,2,3...位
dfs(index + 1); //当一位确定,后面再暴力index+1,存在继续下一个
swap(i, index); //恢复清空,顺延i 重新排列index
}
}
public void swap(int i, int j) {
char tmp = c[i];
c[i] = c[j];
c[j] = tmp;
}