程序员面试题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); }