面試題28 字串的全排列
阿新 • • 發佈:2019-01-28
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;
- }