NoFear

导航

面试题:字符数组的全排列

Posted on 2012-08-29 10:55  Fear_Hao  阅读(600)  评论(0编辑  收藏  举报

参考链接:http://blog.csdn.net/morewindows/article/details/7370155

void _swap (char * a, char *b)
{
         char k = *a;
        * a = *b ;
        * b = k ;
}

int str_all_sort (char * str,int pos, int size )
{       
        
         printf("%d" ,pos);
         if(pos == size)
        {
                 printf("-" );
                 printf("%s " ,str);
        }
         else
        {
                 printf(" " );
                 for(int i= pos; i <=size; i++)
                {
                         //交换位置
                         _swap(&str [i],& str[pos ]);
                         str_all_sort(str ,pos+1, size);
                         //再交换回来
                         _swap(&str [i],& str[pos ]);
                }
        }
         return 0;
}

 

无重复全排列:

122,第一个数1与第二个数2交换得到212,然后考虑第一个数1与第三个数2交换,此时由于第三个数等于第二个数,所以第一个数不再与第三个数交换。再考虑212,它的第二个数与第三个数交换可以得到解决221。此时全排列生成完毕。
这样我们也得到了在全排列中去掉重复的规则——去重的全排列就是从第一个数字起每个数分别与它后面非重复出现的数字交换。用编程的话描述就是i与j交换时,要求[i,j)中没有与a[j]相等的数。下面给出完整代码:
 
bool is_swap ( charstr int beginint target )
{
         for (int i= begin ;i < target; i ++)
                 if (str [ i] == str [target ])
                         return false ;
         return true ;
}