输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
示例:
输入:s = “abc”
输出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”]
限制:
1 <= s 的长度 <= 8
public static String[] permutation(String s) {
//使用set去除重复项
Set<String> ans = new TreeSet<>();
char[] newS = s.toCharArray();
// 按照字母升序排序
Arrays.sort(newS);
// 交互
permutationHelper(ans, newS, 0);
String[] res = new String[ans.size()];
int idx = 0;
for(String str : ans){
res[idx++] = str;
}
return res;
}
/**
* 交换item的帮助方法
* @param ans
* @param s
* @param begin
*/
private static void permutationHelper(Set<String> ans, char[] s, int begin){
if(begin == s.length){
ans.add(String.valueOf(s));
return;
}
for(int i = begin; i < s.length; i++){
if(i != begin && (s[i] == s[i - 1] || s[i] == s[begin]))
continue;
char tmp = s[i];
s[i] = s[begin];
s[begin] = tmp;
permutationHelper(ans, s, begin + 1);
tmp = s[i];
s[i] = s[begin];
s[begin] = tmp;
}
}