题目:输入一个字符串,输出其所有的排列组合。
思路:分别将每一个字符固定在首位置,然后求后面字符的排列组合,递归的思想。
代码如下:
1 void Permutation(char *Str) 2 { 3 assert (Str != NULL); 4 5 Permutation (Str, Str); 6 }
1 void Permutation(char *Str, char *pTemp) 2 { 3 assert (Str != NULL); 4 5 assert (pTemp != NULL); 6 7 if (*pTemp == '\0') 8 { 9 printf ("%s\n", Str); 10 11 return; 12 } 13 14 for (char *pCh = pTemp; *pCh != '\0'; ++pCh) 15 { 16 Swap (*pCh, *pTemp); 17 18 Permutation (Str, pTemp + 1); 19 20 Swap (*pCh, *pTemp); 21 } 22 }
利用C++的template写了一个抽象类型的交换两个操作数内容的函数:
1 template<typename T> 2 void Swap(T &OperatorA, T &OperatorB) 3 { 4 // 这个判断是非常有必要的 5 // 因为如果要交换的两个数相等 6 // ,那么用位运算异或之后就都变成了0 7 // 非但不能交换两个操作数里面的内容,反而破坏了原来的数据,这一点必须避免 8 if (OperatorA != OperatorB) 9 { 10 OperatorA ^= OperatorB; 11 OperatorB ^= OperatorA; 12 OperatorA ^= OperatorB; 13 } 14 }
一个测试结果: