Java中通过给定的最大汉明距离(不匹配数)获得所有字符串组合

Java中通过给定的最大汉明距离(不匹配数)获得所有字符串组合,java,algorithm,permutation,dna-sequence,hamming-distance,Java,Algorithm,Permutation,Dna Sequence,Hamming Distance,是否有一种算法可以根据给定数量的最大允许位置(最大不匹配、最大汉明距离)生成一个字符串(DNA序列)的所有可能的字符串组合 字母表是{A,C,T,G} 字符串AGCC和最大不匹配数2的示例: Hamming distance is 0 {AGCC} Hamming distance is 1 {CGCC, TGCC, GGCC, AACC, ACCC, ATCC, AGAC, AGTC, ..., AGCG} Hamming distance is 2 {?} 一种可能的方法是生成

是否有一种算法可以根据给定数量的最大允许位置(最大不匹配、最大汉明距离)生成一个字符串(DNA序列)的所有可能的字符串组合

字母表是{A,C,T,G}

字符串
AGCC
和最大不匹配数
2
的示例:

Hamming distance is 0
  {AGCC}
Hamming distance is 1
  {CGCC, TGCC, GGCC, AACC, ACCC, ATCC, AGAC, AGTC, ..., AGCG}
Hamming distance is 2
  {?}
一种可能的方法是生成一个具有给定字符串的所有排列的集合,对它们进行迭代,并移除所有具有更大汉明距离的字符串

这种方法非常简单,给定的字符串为20个字符,最大汉明距离为5


还有其他更有效的方法/实现吗?

只需使用普通的置换生成算法,只需绕过距离,当您具有不同的字符时,将其递减即可

static void permute(char[] arr, int pos, int distance, char[] candidates)
{
   if (pos == arr.length)
   {
      System.out.println(new String(arr));
      return;
   }
   // distance > 0 means we can change the current character,
   //   so go through the candidates
   if (distance > 0)
   {
      char temp = arr[pos];
      for (int i = 0; i < candidates.length; i++)
      {
         arr[pos] = candidates[i];
         int distanceOffset = 0;
         // different character, thus decrement distance
         if (temp != arr[pos])
            distanceOffset = -1;
         permute(arr, pos+1, distance + distanceOffset, candidates);
      }
      arr[pos] = temp;
   }
   // otherwise just stick to the same character
   else
      permute(arr, pos+1, distance, candidates);
}
性能说明:

对于一个长度为20、距离为5和5个字符的字母表,已经有超过1700万个候选项(假设我的代码是正确的)


上面的代码在我的机器上运行不到一秒钟(不打印),但不要期望任何生成器能够在合理的时间内生成更多的代码,因为有太多的可能性。

递归调用函数,为返回的所有值生成距离1的组合,并将其放入集合以避免重复谢谢,我也将尝试这种解决方案。谢谢,这似乎效果很好,除非println()非常慢:)
permute("AGCC".toCharArray(), 0, 1, "ACTG".toCharArray());