💦目录
💖今日算法实现:全排列
⭐️实现思路
我们要通过Java代码去实现一个全排列,全排列的思路需要使用到多路递归以及回溯的算法,下面简单的讲一讲怎么实现的多路递归以及回溯。
假设,我们需要全排列的字符串是“ABC”,以下的表格,是我们的操作步骤。
ABC | ||
---|---|---|
A[BC],A[CB] | B[AC],B[CA] | C[AB],C[BA] |
AB[C],AC[B] | BA[C],BC[A] | CA[B],CB[A] |
ABC,ACB | BAC,BCA | CAB,CBA |
🎅实现代码
public class 全排列 {
ArrayList<String> res = new ArrayList<>();
public static void main(String[] args) {
ArrayList<String> res = new 全排列().getPermutation("abcc");
System.out.println(res);
}
public boolean isSame(char[] arr, int first, int end) {
for (int i = first; i < end; i++) {
if (arr[i] == arr[end]) {
return false;
}
}
return true;
}
public ArrayList<String> getPermutation(String A) {
char[] arr = A.toCharArray();
getPermutationCore(arr, 0);
return res;
}
public void getPermutationCore(char[] arr, int k) {
if (k == arr.length) {
res.add(new String(arr));
}
for (int i = k; i < arr.length; i++) {
if (isSame(arr, k, i)) {
swap(arr, k, i);
getPermutationCore(arr, k + 1);
swap(arr, k, i); // 回溯
}
}
}
public void swap(char[] arr, int k, int i) {
char tem = arr[k];
arr[k] = arr[i];
arr[i] = tem;
}
}