题解:利用dfs深度优先+递归回溯思想,以及开辟一个栈来临时保存当前遍历的情况,以此解题
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.ListIterator;
public class test5 {
public static void main(String[] args) {
String s="qwe";
String[] per = permutation(s);
for (String s1 : per) {
System.out.println(s1);
}
}
static String[] permutation(String S) { //官方要求返回String[]
int len=S.length();
ArrayList<ArrayList<String>> res=new ArrayList<>(); //创建保存结果的集合
char[] chs = S.toCharArray(); //将字符转化为字符串
boolean[] used=new boolean[len]; //定义保存字符使用状态的数组
Deque<String> path=new ArrayDeque<>(); //定义一个栈,用于临时保存字符串
dfs(chs,len,0,path,used,res); //进行深度优先搜索
String[] res_arr =new String[res.size()];
for (int i = 0; i < res.size(); i++) { //遍历结果集合,将结果存入到字符串数组中
ListIterator<String> slt = res.get(i).listIterator(); //每一个字符串在res集合中都是一个集合,也就是res是大集合嵌套小集合
String next="";
while (slt.hasNext()){
next+= slt.next(); //取出每个字符拼接成一种排列的结果
}
res_arr[i]=next;
}
return res_arr;
}
private static void dfs(char[] chs, int len, int depth, Deque<String> path, boolean[] used,ArrayList<ArrayList<String>> res) {
if (depth==len){ //若层数达到字符串中字符的个数,说明排列完成
res.add(new ArrayList<>(path)); //将深搜结果加入到 res集合中
return;
}
for (int i = 0; i < len; i++) { //多路分支进行深搜
if (used[i]==true) //如果字符被使用,跳过此次字符的选择
continue;
path.addLast(chs[i]+""); //尝试将字符加入到栈中
used[i]=true; //标记字符已被使用
dfs(chs,len,depth+1,path,used,res); //进行下一个字符的选择
path.removeLast(); //递归回溯到此,恢复原有状态
used[i]=false; //状态重置
}
}
}