2014-12-21 64 views
0

到目前爲止,我的代碼似乎讓我獲得了正確的結果。除了我遇到了問題。當我給它一個長度爲8個字符或更長的字符串時,它似乎並沒有結束。我已經有30億個組合,它仍然在運行。當我用較短的字符串嘗試該方法時,它終止並給出正確的輸出。我不知道還有什麼要嘗試,我會很感激任何提示。這裏是Java代碼:使用遞歸方法和Java的字符串排列

public static void permutation(String prefix, String str){ 
     int n = str.length(); 
     if (n == 0){ 
      permutations++; 
      System.out.println(prefix); 
      System.out.println("Permutations: " + permutations); 
     } 
     else { 
      for (int i = 0; i < n; i++){ 
       permutation(prefix + str.charAt(i), str.substring(0, i) + str.substring(i + 1)); 
      } 
     } 
    } 
+1

此排列計數假定您沒有重複字符。這也是計算階乘的一種非常低效的方式。 – khelwood

+1

問問自己,一串長度* N *有多少個排列?這是** N!**。如果你有一串長度爲8的字符串,那麼你可以有40320個排列,所以顯然你的算法是錯誤的。 –

+1

你只對整體感興趣嗎?或者你最終會對這些排列做些什麼?如果你只想要一個總數,你應該使用建議的答案,或者一個BigInteger版本。如果你想能夠使用排列,這是一個更難的問題。 –

回答

1

此代碼適用於Windows 8和Java 1.8。示例字符串的長度爲9個字符,併產生預期的結果。我不確定你是如何聲明「排列組合」的,但我只是使用了一個int,它應該適用於你,除非你使用的字符串長度超過12個字符。順便說一句,我沒有改變你的任何代碼。這聽起來像你正在做其他的事情,而不只是打印出這些排列,所以也許你的問題是與你的另一塊代碼?

public class example{ 
    public static int permutations = 0; 
    public static void main(String[] args){ 
     String myS = "abcdefghi"; 
     perms(myS); 
     System.out.println(myS.length()); 
    } 
    public static void perms(String s){ 
     permutation("",s); 
    } 
    public static void permutation(String prefix, String str){ 
     int n = str.length(); 
     if (n == 0){ 
     permutations++; 
     System.out.println(prefix); 
     System.out.println("Permutations: " + permutations); 
     } else { 
     for (int i = 0; i < n; i++){ 
      permutation(prefix + str.charAt(i), str.substring(0, i) + str.substring(i + 1)); 
     } 
     } 
    } 
}