1、题目
输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab、cba。
2、解题分析
把复杂的问题分解成小问题。把一个字符串看成由两部分组成:第一部分为它的第一个字符,第二部分是后面的所有字符。如图1所示。
在求整个字符串的排列时,看成两步:首先求所有可能出现在第一个位置的字符,即把第一个字符和后面所有的字符交换。如图1所示。首先固定第一个字符,求后面所有字符的排列。这时候我们仍把后面的所有字符分成两部分:后面字符的第一个字符,以及这个字符之后的所有字符。然后把第一个字符逐一和它后面的字符交换。
图1 求字符串的排列的过程
3、参考代码
- void Permutation(char* pStr, char* pBegin);
- void Permutation(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; *pCh != '\0'; ++ pCh)
- {
- char temp = *pCh;
- *pCh = *pBegin;
- *pBegin = temp;
- Permutation(pStr, pBegin + 1);
- temp = *pCh;
- *pCh = *pBegin;
- *pBegin = temp;
- }
- }
- }
- // ====================测试代码====================
- void Test(char* pStr)
- {
- if(pStr == NULL)
- printf("Test for NULL begins:\n");
- else
- printf("Test for %s begins:\n", pStr);
- Permutation(pStr);
- printf("\n");
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- Test(NULL);
- char string1[] = "";
- Test(string1);
- char string2[] = "a";
- Test(string2);
- char string3[] = "ab";
- Test(string3);
- char string4[] = "abc";
- Test(string4);
- return 0;
- }