参考链接:
字符串全排列算法学习
思路:
一位一位来固定,求后面的全排列,设当前为k位,则让[k,n]位的字符都与第k位进行交换,并且需要保证第k位不重复(代码中用set来实现),然后对于每种情况,递归第k+1位即可。具体过程如下图:
递归的出口,就是只剩一个字符的时候。
代码如下:
import java.util.*;
public class Solution {
public ArrayList<String> permutation(String str) {
ArrayList<String> list = new ArrayList<>();
if (str != null && str.length() > 0) {
permutationHelper(str.toCharArray(), 0, list);
Collections.sort(list);
}
return list;
}
private void permutationHelper(char[] arr, int k, ArrayList<String> list) {
//到达最后一位,添加进list中
if (k == arr.length - 1) {
list.add(String.valueOf(arr));
return;
}
//保存已经交换过的字符,去重
Set<Character> set = new HashSet<>();
for (int i = k; i < arr.length; i++) {
if (!set.contains(arr[i])) {
set.add(arr[i]);
swap(arr, i, k);
permutationHelper(arr, k + 1, list);
swap(arr, k, i);
}
}
}
private void swap(char[] arr, int i, int j) {
char temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}