Java練習:排列(Permutation)問題
阿新 • • 發佈:2018-12-24
輸入個數n,自然數時,n屬於[1,9],輸出1~n所有不重複的排列(數字序列中不允許出現重複的數字);
字元時,n<字母表長度,輸出a~第n個字元的全排列。
按照排列組合,可知全排列個數為n!
1.遞迴
對String s="abcde"的全排列,遞迴為(1)字首為a、s為"bcde"、直到s.length()為0.(2)字首為b、s為"acde"...的全排列。
package algorithm.recursion; import static tips.Print.*; public class Permutations { public static void test(int n) { String alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; String elements = alphabet.substring(0, n); permutation(elements); } /** * 對String s="abcde"的全排列,遞迴為(1)字首為a、s為"bcde"、(2)字首為b、s為"acde"...的全排列。 * 直到s.length()為0 */ public static void permutation(String s) { perm("", s); } private static void perm(String prefix, String s) { int len = s.length(); if (len == 0) pln(prefix); else { for (int i = 0; i < len; i++) perm(prefix + s.charAt(i), s.substring(0, i) + s.substring(i+1, len)); } } }
輸入為3的輸出:
abcacb
bac
bca
cab
cba
對char[] arr的元素a、b、c全排列perm2(char[] a, int n) ,遞迴為(1)arr[0]換位到最後,前面的元素呼叫perm2( a, n-1),直到n == 1;還原;(2)arr[1]換位到最後...
package algorithm.recursion; import static tips.Print.*; public class Permutations { public static void test(int n) { String alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; String elements = alphabet.substring(0, n); //permutation(elements); pln(); int len = elements.length(); char[] a = new char[len]; for (int i = 0; i < len; i++) a[i] = elements.charAt(i); perm2(a, len); } /** * 對char[] arr的元素a、b、c全排列perm2(char[] a, int n) ,遞迴為 * (1)arr[0]換位到最後,前面的元素呼叫perm2( a, n-1),直到n == 1;還原; * (2)arr[1]換位到最後... */ private static void perm2(char[] a, int n) { if (n == 1) { pln(a); return; } for (int i = 0; i < n; i++) { swap(a, i, n-1); perm2(a, n-1); swap(a, i, n-1); } } private static void swap(char[] a, int i, int j) { char c = a[i]; a[i] = a[j]; a[j] = c; } }
2.回溯
練習10-29.: