只需使用正常的排列生成算法,除了你绕过距离,当你有不同的字符时减少它。
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);
}
致电:
permute("AGCC".toCharArray(), 0, 1, "ACTG".toCharArray());
性能说明:
对于 20 的字符串长度、5 的距离和 5 个字符的字母表,已经有超过 1700 万个候选者(假设我的代码是正确的)。
上面的代码在我的机器上花费不到一秒钟的时间(不打印),但不要指望任何生成器能够在合理的时间内生成更多的东西,因为有太多的可能性.