题目:输入"abc",输入[ [a,b,c], [a,c,b], [b,a,c], [b,c,a], [c,a,b], [c,b,a] ]
即给出"abc"的所有排列(排列也属于DFS)
图解参考文章:https://blog.csdn.net/Strom72/article/details/80738818,我就不画了
import com.google.common.collect.Lists;
import org.apache.commons.lang3.StringUtils;
import java.util.List;
/**
* Author:m
* Date: 2023/04/14 21:56
*/
public class Permutation {
public static void main(String[] args) {
String s = "abc";
List<List<String>> res = dfs(s);
System.out.println(res);
}
private static List<List<String>> dfs(String s) {
if (StringUtils.isBlank(s)) {
return Lists.newArrayList();
}
List<List<String>> result = Lists.newArrayList();
permutation(result, s.toCharArray(), 0);
return result;
}
private static void permutation(List<List<String>> result, char[] chars, int i) {
// 1.终止条件
// 2.大容器添加小容器
if (i == chars.length) {
result.add(Lists.newArrayList(String.valueOf(chars)));
}
// 3.循环
for (int j = i; j < chars.length; j++) {
// 3.1过滤|去重
// 3.2优化减支
// 3.3小容器添加元素(这里使用chars数组本身作为我们的小容器)
swap(chars, i, j);
// 3.4递归(横向是bfs,即循环即j++、纵向是dfs,即递归即i++)
permutation(result, chars, i + 1);
// 3.5回溯(原本是删除小容器的最后一个元素,这里是将小容器即chars数组还原,因为我们使用它作为小容器进行变化然后添加至大容器,所以作为数组本身还需要回溯回来)
swap(chars, i, j);
}
}
private static void swap(char[] chars, int i, int j) {
char temp = chars[i];
chars[i] = chars[j];
chars[j] = temp;
}
}