1、题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
2、上代码
import java.util.*;
public class Solution {
TreeSet<String> res = new TreeSet<>(); //可能有字符重复,用来去除重复的字符串序列
public ArrayList<String> Permutation(String str) {
if(str == null || str.length() == 0) return new ArrayList<>(res);
boolean[] visit = new boolean[str.length()];
char[] arr = str.toCharArray();
StringBuilder sb = new StringBuilder();
dfs(arr, 0, visit, sb);
//ArrayList(Collection<? extends E> c)
return new ArrayList<>(res);
}
void dfs(char[] arr, int u, boolean[] visit, StringBuilder sb){
int len = arr.length;
if(len == u) {
res.add(sb.toString());
return;
}
for(int i = 0;i < len;i ++) {
if(!visit[i]) { //该位置没有被访问过
visit[i] = true;
char c = arr[i];
sb.append(c);
dfs(arr, u + 1, visit, sb);
sb.deleteCharAt(sb.length() - 1);
visit[i] = false;
}
}
}
}