这是一个标准函数,用于打印字符串的字符排列:
void permute(char *a, int i, int n) { int j; if (i == n) printf("%s\n", a); else { for (j = i; j < n; j++) //check till end of string { swap((a+i), (a+j)); permute(a, i+1, n); swap((a+i), (a+j)); //backtrack } } } void swap (char *x, char *y) { char temp; temp = *x; *x = *y; *y = temp; }
它工作正常,但是有问题,它还会打印一些重复的排列,例如:
如果字符串是“ AAB”
输出为:
AAB ABA AAB ABA BAA BAA
这也有3个重复的条目。
有办法防止这种情况发生吗?
-
谢谢
Alok Kr。
记下您之前交换的字符:
char was[256]; /* for(j = 0; j <= 255; j++) was[j] = 0; */ bzero(was, 256); for (j = i; j <= n; j++) { if (!was[*(a+j)]) { swap((a+i), (a+j)); permute(a, i+1, n); swap((a+i), (a+j)); //backtrack was[*(a+j)] = 1; } }
这必须是迄今为止所有条目中最快的,在“ AAAABBBCCD”(100个循环)上有一些基准测试:
native C - real 0m0.547s STL next_permutation - real 0m2.141s