该题目其实就是对数组中的每个字符和其它字符进行交换完成的,但是该交换过程是递归完成的。以"abc"为例,在第一层递归中,会将第一个字符'a'和后续字符进行依次交换,形成"abc"、"bac"和"cba"传入下一层递归,在下一次递归中,又会分别以整个字符串的第二个字符开始,与后续字符依次交换。当交换到最后一个字符时,说明交换完毕,加入Set中,之所以使用Set是因为题目要求结果是去重且按字典序排序的。

```
public static ArrayList<string> Permutation(String str) {
if (str == null || str.length() == 0) {
return new ArrayList<>();
}
Set<string> set = new TreeSet<>();
helper(str.toCharArray(), 0, set);
return new ArrayList<>(set);
}
public static void helper(char[] s, int i, Set<string> set) {
if (i == s.length) {
set.add(String.valueOf(s));
}
for (int j = i; j < s.length; j++) {
swap(s, i, j);
helper(s, i + 1, set);
swap(s, i, j);
}
}
public static void swap(char[] s, int i, int j) {
if (i == j) return
s[i] ^= s[j];
s[j] ^= s[i];
s[i] ^= s[j];
}</string></string></string>