1

我正在尝试修改 [这里]在字符串中生成字符组合的答案 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 集合中每个字母的值,并将集合中的一个或多个字符附加到它。有人可以给我一两个提示吗?非常感激。

4

2 回答 2

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

随意添加任何修改或将其用作模板

于 2013-02-04T07:51:52.873 回答
0

String prfx需要在函数之外。用 a 替换它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);
   }
}
于 2013-02-04T11:00:23.390 回答