今天看到一道编程题目,题目内容:
输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出字符a,b,c 所能排列的所有字符串 abc,acb, bca,bac,cab 和 cba。
对于本题开始想比较复杂,可以将复杂问题简单化处理,分解为多个小问题的方式。
思路:
1)可以将一个字符串看成由两部分组成:第一部分为第一个字符,第二部分为除第一个字符外的所有字符。首先求所有可能出现在第一个位置的所有字符,把每一个字符都和其他字符交换位置。如下图所示:
(a)
(b)
(c)
2)第二步固定第一个字符,对后面的字符进行全排列,仍然将除第一个字符外的所有字符分为两个部分,重复 1) 步骤,直到固定的字符为最后一个字符,即找到所有的全排列。
重点代码实现:
void permu( char *pStr)
{
if ( pStr == NULL)
return ;
Permutation( pStr , pStr )
}
void Permutation ( char * pStr , char * pBegin )
{
if ( pBegin == ' \0 ' )
printf ( "%s\n", pStr );
else
{
for( char *pCh = pBegin; *pBegin != '\0'; ++pCh)
{
char temp = *pCh;
*pCh = *pBegin;
*pBegin = temp;
printf ( "%s\n", pStr );
}
Permutation(pStr,pBegin+1);
}
}