程序员面试题100题第28题——全排列

题目:

输入一字符串,输出字符串的所有排列

分析:

我们以三个字符abc为例。首先我们固定第一个字符a,求后面两个字符bc的全排列。当bc的排列求好之后,这就是一部分解;

现在我们把第一个字符a和后面的字符b交换得到bac,固定第一个字符b,求后面两个字符ac的全排列。当ac的排列求好之后,这是另外一部分解;

接着我们该把c放在第一个位置了,为了确保这次c是和原先处于第一位置的a交换,必须把b和a交换回来,得到abc,然后再把c交换到第一位置得到cba,固定第一个字符c,求后面两个字符ba的全排列。当ba的排列求好之后,这是另外一部分解;

三部分解组成所有的解。

 

又如abcd

abcd

a{bcd的排列}//得到部分解

abcd //进入下一次循环保证字符交换回来

↓     

abcd

bacd

b{acd的排列}//得到部分解

abcd //进入下一次循环保证字符交换回来

↓     

abcd

cbad

c{bad的排列}//得到部分解

abcd //进入下一次循环保证字符交换回来

↓    

abcd

dbca

d{bcd的排列}//得到部分解

abcd //进入下一次循环保证字符交换回来

 

下面是代码:

void Permutation(char* pStr, char* pBegin)
{
    if(pStr==NULL || pBegin==NULL)
        return ;
    if(*pBegin == '\0')
    {
        printf("%s\n",pStr);//%s 输出整个字符串
    }else{
        for(char* pCh=pBegin; *pCh!='\0' ; ++pCh)
        {
            char temp=*pCh;//交换到第一位置
            *pCh=*pBegin;
            *pBegin=temp;

            Permutation(pStr,pBegin+1);

            temp=*pCh;    //交换回来使得下次循环位置不变
            *pCh=*pBegin;
            *pBegin=temp;
        }
    }
}
void Permutation(char* pStr)
{
    Permutation(pStr, pStr);
} 

 

posted @ 2012-10-01 19:28  logzh  阅读(487)  评论(0编辑  收藏  举报