这只是一个非通用的方法,对于计算4个数或5个数以下的全排速度比较快,但是5以上就有点麻烦。
分析:如求abcd的全排列,我们看看abcdabcd,由a开始扫a->bcd,a->cdab,a->dabc,只考察a后面的三个,重复的a去掉(黑体表示),然后再考虑逆转字符串dcbadcba,看看从a开始的:a->dcb,a->cbad,a->bdc(这里像循环一样)。
void perm(char *arr, int size) { for (int pos = 0; pos < size/2; pos++) { int index = 1; for (int i = 0; i < size/2 - 1; i++) { cout<<arr[pos]<<"->"; int k = 0; int j = 0; while(k < size/2 - 1) { if (arr[pos] != arr[(pos + index + j)%size]) { k++; cout<<arr[(pos + index + j)%size]<<" "; } j++; } index++; cout<<endl; } } }
输出结果为:
char *ch = "abcdabcd"; perm(ch, 8); char *chf = "dcbadcba"; perm(chf, 8);
如果有更好的建议,烦请告知。