2013-02-04 65 views
1

我試圖修改[代碼] Generating character combination in a string doesn't work entirely, why?中的答案2中的java代碼,使其具有完成整個作業的一個方法,並且只接受一個參數,組合中的字符數(即,在main中稱爲方法(int ))。修改此代碼只接受一個參數(字符組合的長度)?

它實際上是一項家庭作業,用於編寫與上面鏈接中的代碼相同的遞歸代碼,即,打印所需長度的所有字符組合,但在這種情況下是從一組固定字符A,C,G和T(例如,如果調用方法(2),則打印AA,AC,AG,AT,CA,CC ...)。

到目前爲止,我只帶了:

public static void printAllDNAs(int n) { 
    String[] dna; 
    dna = new String[4]; 
    dna[0] = "A"; 
    dna[1] = "C"; 
    dna[2] = "G"; 
    dna[3] = "T"; 

    String prfx = ""; 
    if (n == 0) { 
     System.out.println(prfx); 
    } else { 
     for (int i = 0; i < dna.length; i++) { 
      System.out.print(prfx + dna[i]); 
      printAllDNAs(n - 1); 
     } 
    } 
} 

public static void main(String[] args) { 
    printAllDNAs(3); 
} 
} 

這顯然是不正確的。我知道我需要依次給prfx集合中每個字母的值,並從集合中追加一個或多個字符到它。有人可以給我一兩個提示,我應該這樣做嗎?不勝感激。

回答

0

你可以試試這個解決方案:

public static void printDNARecursive(ArrayList<String> dnaCombinations, String prefix, String[] dnaArray, int depth) { 
    if (prefix.length() == depth || dnaArray.length == 0) { 
     return; 
    } 
    for (int i = 0; i < dnaArray.length; i++) { 
     String dna = dnaArray[i]; 
     if (dna == null) { 
      continue; 
     } 
     dnaCombinations.add(prefix + dna); 
     String[] copyOf = Arrays.copyOf(dnaArray, dnaArray.length); 
     copyOf[i] = null; 
     printDNARecursive(dnaCombinations, prefix + dna, copyOf, depth); 
    } 
} 

它是如何工作的 - 這個代碼利用而不是打印DNA篩選它保存裏面dnaCombinations變量。如果你的DNA達到最大深度的長度(如depth變量),那麼它不會進一步。

它與你的有點不同,因爲在dnaCombinations裏面你也會有"A", "C", "G", "T"但是你可以從dnaCombinations打印只有你選擇的長度的字符串。

在這裏,小例子,說明它的工作:

public static void main(String... args) { 
    String[] dna = new String[] { "A", "C", "G", "T"}; 
    ArrayList<String> result = new ArrayList<String>(); 
    printDNARecursive(result, "", dna, 2); 
    for (String d : result) { 
     System.out.println(d); 
    } 
} 

而且結果是:A AC AG AT C CA CG CT G GA GC GT T TA TC TG

隨意添加任何修改或使用它只是作爲一個模板

+0

非常感謝!唉,在這個算法和數據結構課程中,我們不允許使用其他現成的類,如ArrayList,除非指定。但我會從中學到很多,所以非常感謝。 –

0

String prfx需要到外面功能。用char[]替代它也使事情變得更容易和更快。見下面的解決方案

如果你只是想一個功能:

private static char arr[]; 
private static final char[] dna = "ACGT".toCharArray(); 
public static void printAllDNAs(int n) 
{ 
    if (arr == null) 
     arr = new char[n]; 
    if (n == 0) 
    { 
     System.out.println(String.valueOf(arr)); 
     return; 
    } 
    for (char c: dna) 
    { 
     arr[n-1] = c; 
     printAllDNAs(n-1); 
    } 
    if (n == arr.length) 
     arr = null; 
} 

如果你不介意的多種功能,這可能會更好(+非常稍快):

public static void printAllDNAs(int n) 
{ 
    arr = new char[n]; 
    printAllDNAsInternal(n); 
} 

private static void printAllDNAsInternal(int n) 
{ 
    if (n == 0) 
    { 
     System.out.println(String.valueOf(arr)); 
     return; 
    } 
    for (char c: dna) 
    { 
     arr[n-1] = c; 
     printAllDNAs(n-1); 
    } 
} 
+0

非常感謝,非常感謝! –

相關問題