Если нет ограничения по длине для повторения ваших 4 символов, есть очень простой алгоритм, который даст вам то, что вы хотите. Просто закодируйте вашу строку в виде двоичного числа, где все 2-битные комбинации кодируют один из четырех символов. Чтобы получить все возможные перестановки с повторениями, вам просто нужно перечислить «подсчитать» все возможные числа. Это может быть довольно долго (больше, чем возраст вселенной), поскольку 1000 символов будут иметь длину 2000 бит. Это действительно то, что вы хотите сделать? Переполнение кучи может быть не единственным ограничением ...
Ниже приведена тривиальная реализация C, которая перечисляет все повторения длиной ровно n (n ограничено 16000 с 32-битным беззнаковым) без выделения памяти. Я оставляю читателю возможность перечислять все повторения не более длины п.
#include <stdio.h>
typedef unsigned char cell;
cell a[1000];
int npack = sizeof(cell)*4;
void decode(cell * a, int nbsym)
{
unsigned i;
for (i=0; i < nbsym; i++){
printf("%c", "GATC"[a[i/npack]>>((i%npack)*2)&3]);
}
printf("\n");
}
void enumerate(cell * a, int nbsym)
{
unsigned i, j;
for (i = 0; i < 1000; i++){
a[i] = 0;
}
while (j <= (nbsym / npack)){
j = 0;
decode(a, nbsym);
while (!++a[j]){
j++;
}
if ((j == (nbsym / npack))
&& ((a[j] >> ((nbsym-1)%npack)*2)&4)){
break;
}
}
}
int main(){
enumerate(a, 5);
}