2017-01-13 8 views
0

所以我想編寫一個代碼,打印出所有nPr方式下的字符串排列,其中n是字符串長度,r是輸入。它需要一個前綴和字符串,以及一個整數。它是這樣做的,除了每次打印nPn排列而不是nPr排列。我的置換代碼每次打印nPn?

public static void main(String[] args){ 
    String x = "abcd"; 
    permu("", x, 2); 
} 
public static void permu(String pre, String x, int r){ 
    if(x.length() == 0) 
     System.out.println(pre.substring(0, r)); 
    else{ 
     for(int i = 0; i < x.length(); i++) 
      permu(pre + x.charAt(i), x.substring(0, i) + x.substring(i + 1, x.length()), r); 
    } 
} 

當r = 2,我想它打印AB,AC,AD,BA,BC,BD,CA,CB,CD,DA,DB,DC。但它打印了所有內容的兩倍。

回答

1

您必須將遞歸限制設置爲r(現在是n)。可能是這樣的:

if(x.length() == 0) 
change to 
    if(pre.length() == r) 
0

結果不應該讓你感到驚訝:你的代碼決定了所有的24個排列。它僅在打印時強制執行最大長度。你可以知道,因爲r除了在打印時以外不在任何地方使用。

如果您打印整個字符串,其結果是:

abcd 
abdc 
acbd 
acdb 
.... 

你只能看到什麼本質上是一個全排列的第一個字符。

如果你想擁有的2真正挑選出的4,你應該停止遞歸你有回升r項目後:

if (pre.length() == r) 
    System.out.println(pre.substring(0, r)); 

您可能希望確保當有人調用它的代碼仍然有效其中r大於字符串長度:

if (pre.length() == r || x.length() == 0) 
    System.out.println(pre.substring(0, r)); 
+0

非常感謝。但我認爲你在數學上不能這樣做,因爲r必須小於或等於n –

+0

這並不能阻止任何人調用'permu(「」,「abcd」,12)'。代碼只是防止不良輸入的一種保護措施。 –