面试题28 字符串的全排列

1、题目

输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab、cba。

2、解题分析

把复杂的问题分解成小问题。把一个字符串看成由两部分组成:第一部分为它的第一个字符,第二部分是后面的所有字符。如图1所示。

在求整个字符串的排列时,看成两步:首先求所有可能出现在第一个位置的字符,即把第一个字符和后面所有的字符交换。如图1所示。首先固定第一个字符,求后面所有字符的排列。这时候我们仍把后面的所有字符分成两部分:后面字符的第一个字符,以及这个字符之后的所有字符。然后把第一个字符逐一和它后面的字符交换。


图1 求字符串的排列的过程

3、参考代码

[cpp]  view plain copy
  1. void Permutation(char* pStr, char* pBegin);  
  2.   
  3. void Permutation(char* pStr)  
  4. {  
  5.     if(pStr == NULL)  
  6.         return;  
  7.   
  8.     Permutation(pStr, pStr);  
  9. }  
  10.   
  11. void Permutation(char* pStr, char* pBegin)  
  12. {  
  13.     if(*pBegin == '\0')  
  14.     {  
  15.         printf("%s\n", pStr);  
  16.     }  
  17.     else  
  18.     {  
  19.         for(char* pCh = pBegin; *pCh != '\0'; ++ pCh)  
  20.         {  
  21.             char temp = *pCh;  
  22.             *pCh = *pBegin;  
  23.             *pBegin = temp;  
  24.   
  25.             Permutation(pStr, pBegin + 1);  
  26.   
  27.             temp = *pCh;  
  28.             *pCh = *pBegin;  
  29.             *pBegin = temp;  
  30.         }  
  31.     }  
  32. }  
  33.   
  34. // ====================测试代码====================  
  35. void Test(char* pStr)  
  36. {  
  37.     if(pStr == NULL)  
  38.         printf("Test for NULL begins:\n");  
  39.     else  
  40.         printf("Test for %s begins:\n", pStr);  
  41.   
  42.     Permutation(pStr);  
  43.   
  44.     printf("\n");  
  45. }  
  46.   
  47. int _tmain(int argc, _TCHAR* argv[])  
  48. {  
  49.     Test(NULL);  
  50.   
  51.     char string1[] = "";  
  52.     Test(string1);  
  53.   
  54.     char string2[] = "a";  
  55.     Test(string2);  
  56.   
  57.     char string3[] = "ab";  
  58.     Test(string3);  
  59.   
  60.     char string4[] = "abc";  
  61.     Test(string4);  
  62.   
  63.     return 0;  
  64. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值