package od0109;
import java.util.*;
/**
* 字母全排列 回溯法
* @author Administrator
*
*/
public class Pailiezuhe2 {
public static void main(String[] args) {
Pailiezuhe2 pailiezuhe2 = new Pailiezuhe2();
System.out.println(pailiezuhe2.Permutation("aba"));
}
private Set<String> set = new HashSet<>(); // 去重
private ArrayList<String> ret = new ArrayList<>(); // 返回
public ArrayList<String> Permutation(String str) {
if (str.length() == 0)
return ret;
boolean[] visited = new boolean[str.length()];
dfs(str, "", visited);
// 有序
// (1.循环Set->ArrayList)
String[] sarr = set.toArray(new String[set.size()]);
Arrays.sort(sarr);
for (String s : sarr) {
ret.add(s);
}
return ret;
}
// 回溯递归-全排列
// 以a开头时 和其他两个拼
// 以b开头时 和其他两个拼
// 合起来去个重
private void dfs(String s, String ch, boolean[] visited) {
// 一组排列
//递归的结束条件
if (s.length() == ch.length()) {
set.add(ch);
return;
}
for (int i = 0; i < s.length(); i++) {
char temp = s.charAt(i);
//默认都是false
if (visited[i])
continue;
visited[i] = true;
dfs(s, ch + String.valueOf(temp), visited);
visited[i] = false;
}
}
}