2012-03-14 23 views
1

我想獲得像字母表的字符串排列的特定組合。要理解我,我會告訴你,我使用的代碼:我想獲得排列的特定組合?

public class PermutationExample { 

public static List<String> getPermutation(String input) { 

    List<String> collection = null; 

    if (input.length() == 1) { 
     collection = new ArrayList<String>(); 
     collection.add(input); 
     return collection; 
    } else { 
     collection = getPermutation(input.substring(1)); 
     Character first = input.charAt(0); 
     List<String> result = new ArrayList<String>(); 
     for (String str : collection) { 
      for (int i = 0; i < str.length(); i++) { 
       String item = str.substring(0, i) + first 
         + str.substring(i); 
       result.add(item); 
      } 
      String item = str.concat(first.toString()); 
      result.add(item); 
     } 
     return result; 
    } 

} 

public static void main(String[] args) { 
    System.out.println(PermutationExample.getPermutation("ABCD")); 

} 
} 

此代碼工作得很好,我可以得到每一個組合,我可以把它從列表中,如果我需要5個元素,我可以接收它。但是,如果字符串是字母表...,沒有用,它太大了。我必須做的,從所有26中獲得像1221這樣的特定元素!組合?

回答

1

我解決了類似的問題,前一段時間,只有在蟒蛇。

如果你需要的僅僅是第n個排列,那麼如果你試圖去考慮只產生你需要的排列,你可以做得更好,然後生成每個排列並返回第n個排列。

你可以通過計算出你想要的排列數目前面的元素是什麼,然後遞歸地選擇剩下的元素。

假設值的集合[0,...,X],對於任何值,使得COL [n]的< COL [N + 1] 對於N個元素,有N!可能的排列,這個集合將完全顛倒的情況。

我們將在每個(N-1)後看到集合頭部的變化!排列,所以如果n是<(N-1)!,則頭部是頭部。然後你有一個剩餘的排列數,你可以遞歸地應用相同的邏輯。

這有幫助嗎?我知道這是相當高的水平,你得想想了一點,但也許它會讓你在正確的軌道上。

+0

是的,我需要第N個字符串的排列,但我不知道如何解決這個問題:/ – Aleksiev 2012-03-15 01:53:41