題目:輸入一個字符串,打印出該字符串中字符的所有排列。(假設字符串中所有字符都不相同)
例如:輸入字符串abc,則打印出由字符a、b、c所能排列出來的所有字符串abc、acb、bac、bca、cab和cba。
將大問題分解爲小問題,本題思路是:把字符串看成有兩部分組成:第一部分是它的第一個字符,第二部分是後面的所有字符。求整個字符串的排列,可以分成兩步:首先求所有可能出現在第一個位置的字符,即把第一個字符和後面的所有字符做交換。
其次是固定第一個字符,求後面所有字符的排列。這時候仍把後面的所有字符分成兩部分,後面字符的第一個字符以及這個字符之後的所有字符。
遞歸實現代碼:
#include <iostream>
#include <stdio.h>
using namespace std;
//指針pStr指向整個字符串的第一個字符,pBegin指向當前我們做排列操作的字符串的第一個字符。
//每一次遞歸的時候,從pBegin向後掃描每一個字符,在交換pCh和pBegin指向的字符之後,再對pBegin後面的字符串遞歸的做排列操作。
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 Permutation(char* pStr)
{
if (pStr == NULL)
return;
Permutation(pStr, pStr);
}
int main()
{
//不能以常量字符串的形式傳進去,char* pstr1 = "abc",這種形式傳進去之後指針指向的常量字符串,在內存中位置大小不變,不能修改,只能讀不能寫操作。
char ptr[] = "abc"; //這裏傳參數的時候要注意,如果想改變傳入的字符串,就要以字符數組的形式傳進去,這樣對數組中的內容可以操作。
Permutation(ptr);
return 0;
}
程序的輸出爲: