
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) {
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();
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));
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;
}
}
}