2012-03-12 39 views
2

比方說alphabet = "abcd1234" 我想要所有具有4位數的組合。 我不想穿過所有的排列,只選擇那些長度爲4個字符的字母,因爲字母表可能很大。獲取給定字母表的所有4個字符的組合

編輯:這是我迄今爲止

String alpha = "abcdefg"; 

     for (int i = 0 ; i < alpha.length() ; i++) { 
      for (int j = i ; j < alpha.length()-i ; j++) 
        System.out.println(String.valueOf(alpha.charAt(i)) + String.valueOf(alpha.charAt(j)) ); 
     } 

不幸的是我得到的只有2個字符的字。我不能用相同的循環結構打印4個字符的單詞。

+0

組合!=排列 – simchona 2012-03-12 16:44:30

+1

通過不顯示你的勞動成果,你意味着你懶得自己做或不夠聰明。請通過展示你所做的事情來證明這些假設是錯誤的。 – 2012-03-12 16:45:20

+0

「N choose K」問題在幾個網站上進行了充分的討論,這是你想要的嗎?就像安德傑問......你現在面臨什麼問題? – pcalcao 2012-03-12 16:47:05

回答

4

如果我正確理解問題 - 所有組合aaaa到4444 - 那麼這將工作。它是「可擴展的」 - 不需要每個字符的嵌套循環。

String alpha = "abcd1234"; 
char[] seq = alpha.toCharArray(); 

int length = 4; 
StringBuilder builder = new StringBuilder(" "); 

int[] pos = new int[length]; 
int total = (int) Math.pow(alpha.length(), length); 
for (int i = 0; i < total; i++) { 
    for (int x = 0; x < length; x++) { 
     if (pos[x] == seq.length) { 
      pos[x] = 0; 
      if (x + 1 < length) { 
       pos[x + 1]++; 
      } 
     } 
     builder.setCharAt(x, seq[pos[x]]); 
    } 
    pos[0]++; 

    System.out.println(builder.toString()); 
} 
1

最簡單 - 如果數字的數量很小並且固定 - 將是簡單的枚舉。只需遍歷字母表的成員即可。

從名稱字母表中,我認爲該字符串中的每個字符都是唯一的,但可以在解決方案中出現多次。如果在接受排列之前沒有額外檢查i1 != i2等等。

int alphaLen = alphabet.length(); 
for (int i1 = 0; i1 < alphaLen; ++i1) { 
    for (int i2 = 0; i2 < alphaLen; ++i2) { 
     for (int i3 = 0; i3 < alphaLen; ++i3) { 
      for (int i4 = 0; i4 < alphaLen; ++i4) { 
       foo(alphabet.charAt(i1) + alphabet.charAt(i2) + alphabet.charAt(i3) + alphabet.charAt(i4)); 
      } 
     } 
    } 
} 
相關問題