题目:
输入一字符串,输出字符串的所有排列
分析:
我们以三个字符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);
}