1. 程式人生 > >面試題28 字串的全排列

面試題28 字串的全排列

1、題目

輸入一個字串,打印出該字串中字元的所有排列。例如輸入字串abc,則打印出由字元a、b、c所能排列出來的所有字串abc、acb、bac、bca、cab、cba。

2、解題分析

把複雜的問題分解成小問題。把一個字串看成由兩部分組成:第一部分為它的第一個字元,第二部分是後面的所有字元。如圖1所示。

在求整個字串的排列時,看成兩步:首先求所有可能出現在第一個位置的字元,即把第一個字元和後面所有的字元交換。如圖1所示。首先固定第一個字元,求後面所有字元的排列。這時候我們仍把後面的所有字元分成兩部分:後面字元的第一個字元,以及這個字元之後的所有字元。然後把第一個字元逐一和它後面的字元交換。


圖1 求字串的排列的過程

3、參考程式碼

  1. void Permutation(char* pStr, char* pBegin);  
  2. void Permutation(char* pStr)  
  3. {  
  4.     if(pStr == NULL)  
  5.         return;  
  6.     Permutation(pStr, pStr);  
  7. }  
  8. void Permutation(char* pStr, char* pBegin)  
  9. {  
  10.     if(*pBegin == '\0')  
  11.     {  
  12.         printf("%s\n", pStr);  
  13.     }  
  14.     else
  15.     {  
  16.         for(char* pCh = pBegin; *pCh != '\0'; ++ pCh)  
  17.         {  
  18.             char temp = *pCh;  
  19.             *pCh = *pBegin;  
  20.             *pBegin = temp;  
  21.             Permutation(pStr, pBegin + 1);  
  22.             temp = *pCh;  
  23.             *pCh = *pBegin;  
  24.             *pBegin = temp;  
  25.         }  
  26.     }  
  27. }  
  28. // ====================測試程式碼====================
  29. void Test(char* pStr)  
  30. {  
  31.     if(pStr == NULL)  
  32.         printf("Test for NULL begins:\n");  
  33.     else
  34.         printf("Test for %s begins:\n", pStr);  
  35.     Permutation(pStr);  
  36.     printf("\n");  
  37. }  
  38. int _tmain(int argc, _TCHAR* argv[])  
  39. {  
  40.     Test(NULL);  
  41.     char string1[] = "";  
  42.     Test(string1);  
  43.     char string2[] = "a";  
  44.     Test(string2);  
  45.     char string3[] = "ab";  
  46.     Test(string3);  
  47.     char string4[] = "abc";  
  48.     Test(string4);  
  49.     return 0;  
  50. }