求一个全排列函数:
如p([1,2,3])输出:[123]、[132]、[213]、[231]、[321]、[312]
之前在http://blog.csdn.net/hackbuteer1/article/details/6878627看到的一个题目,Hackbuteer1老兄的其余题目应该都没有错误,但求全排列的题目的第二种解法显然是不能满足输出无重复排列的要求的。因为其源程序中判断重复的语句(也就是本程序中注释语句第三行处)只是判断的该位置数据与其之后的数据是否有重复,而忽略了与之前语句重复的情况,因而难以实现完全去除重复。如:输入:“abb”,其程序输出依次为:“abb”“bab”“bba”“bba”“bab”!现将其源程序更正如下,应该可以实现完全去除重复了,望各位大牛小牛非牛指正!
- #include <iostream>
- using namespace std;
- void Permutation(char *pStr,char *pBegin)
- {
- assert(pStr&&pBegin);//assert等效于检验数据是否总是具有预期的大小,它仅用于检查确实不可能的条件
- //不会引起任何运行时检查,没有任何运行时代价,但不能用来代替运行时的逻辑检查
- if(*pBegin == '\0')
- printf("%s\n",pStr);
- else{
- char temp = 0;
- for(char *pCh = pBegin;*pCh != '\0';++pCh)
- {
- int i = 0;
- for (char *pCh2 = pBegin;pCh2 != pCh;++pCh2)
- { //判断*pBegin至*pCh之间是否有与*pCh重复的字符
- //如有,则不再进行交换,因为之前肯定已经有这个排列了
- if(i)
- break;
- if (*pCh2 == *pCh)
- ++i;
- }
- if(pCh != pBegin&&*pCh == *pBegin||i)//为避免生成重复排列,当不同位置的字符相同时不再交换
- continue;
- temp = *pCh;
- *pCh = *pBegin;
- *pBegin = temp;
- Permutation(pStr,pBegin+1);
- temp = *pCh;
- *pCh = *pBegin;
- *pBegin = temp;
- }
- }
- }
- int main(void){
- char str[] = "abb";
- Permutation(str,str);
- return 0;
- }