Java字符串排列算法
題目:現有ABCDE 5個球 構成的排列組合 可重復抽取 最多取到16個 共有多少種組合方式?
比如:取1個球可以構成的組合有 A B C D E 共5種,取2個球可以構成的組合有 5+4+3+2+1=15種 (BA 和 AB 這種重復的排列 算成一種)
AA AB AC AD AE
BB BC BD BE
CC CD CE
DD DE
EE
取 3 個球可以構成的組合是 (5+4+3+2+1)+(4+3+2+1)+(3+2+1)+(2+1)+1= 35種
AAA AAB AAC AAD AAE
ABB ABC ABD ABE
ACC ACD ACE
ADD ADE
AEE
BBB BBC BBD BBE
BCC BCD BCE
BDD BDE
BEE
CCC CCD CCE
CDD CDE
CEE
DDD DDE
DEE
EEE
程序代碼示例:
1 import java.util.Scanner; 2
3 /**
4 * 主要是利用遞歸來來實現。主要思想是把一個字符串分為倆段來處理,首先取出第一個字符串,然后用后面的字符來與它進行拼湊。 5 */
6 public class Zuhe { 7 private static String str = "ABCDE";// 字符串
8 private static int n = 3;// 選擇的個數
9 private static int count = 0;//組合的個數
10
11 public static void main(String[] args) { 12 new Zuhe(); 13 } 14
15 public Zuhe() { 16 Scanner input = new Scanner(System.in); 17 System.out.println("請輸入要選擇的個數(要少於" + str.length() + "個)"); 18 n = Integer.parseInt(input.nextLine()); 19 find("", 0); 20 System.out.println("共有"+count+"種組合"); 21
22 } 23 /**
24 *第一個參數是代表第一個字符,第二個參數代表開始尋找點的位置 25 */
26 public static void find(String s, int i) { 27 // 保存上一次的字符串
28 String temp = s; 29 //判斷是否符合要求
30 if (s.length() == n) { 31 count++; 32
33 System.out.print(s + " "); 34 if (count % 10 == 0) 35 System.out.println(); 36 return; 37 } 38 //從尋找點開始循環,風之境地
39 for (int k =i; k < str.length(); k++) { 40 s = temp; 41 s += str.charAt(k); 42 find(s, k); 43 } 44 } 45 }