深搜的详细过程理解,全排列是经典深搜问题,这里先讨论最简单的全排列问题,不考虑重复问题。
直接上代码
public static ArrayList<String> Permutation(String str) {
boolean visited[] = new boolean[str.length()];
ArrayList<String> ans = new ArrayList<>();
dfs(str, 0, "", ans, visited);
return ans;
}
static void dfs(String str, int index, String path, ArrayList<String> ans, boolean visited[]) {
if (index == str.length()) {
ans.add(path);
return;
} else {
for (int i = 0; i < str.length(); i++) {
if (!visited[i]) {
visited[i] = true;
path += str.charAt(i);
dfs(str, index + 1, path, ans, visited);
visited[i] = false;
path = path.substring(0, path.length() - 1);
}
}
}
}
其中dfs的几个参数:str:输入的全字符串,下图中输入为abc。index:当前深搜的下标。path:当前深搜的路径。ans:最后的结果集合。visited标记当前那些字符被访问过。下面上图,每一次深搜的过程及这些参数的变化过程。
带标数字的表示执行顺序