題目:
輸入一個字符串,打印出該字符串中字符的所有排列。例如輸入字符串abc,則打印出由字符a,b,c所能排列出來的所有字符串abc,acb,bac,bca,cab,cba。
求整個字符串的排列,可以看成兩步:
1、求所有可能出現在第一個位置的字符,即把第一個字符和後面所有的字符交換。
2、固定第一個字符,求後面所有字符的排列,這時依然將後面的所有字符分成兩部分:後面字符的第一個字符,以及這個字符之後的所有字符。
void Permutation(char* pStr,char* pBegin)
{
//*pStr指向整個字符串的第一個字符
//*pBegin指向我們做排列操作的字符串的第一個字符
if(*pBegin=='\0')
cout<<pStr<<endl;
else
{
for(char* pCH=pBegin;*pCH!='\0';++pCh)
{
char temp=*pCh;
*pCh=*pBegin;
*pBegin=temp;
//每一次遞歸,就將pBegin往後移一個字符
Permutation(pStr,pBegin+1);
temp=*pCh;
*pCh=*pBegin;
*pBegin=temp;
}
}
}
void Permutation(char* pStr)
{
if(pStr==NULL)
return;
Permutation_process(pStr,pStr);
}
如果需要按照要求擺放若干數字,我們可以先求出這些數字所有排列,然後再一一判斷是不是滿足題目的要求。
1、求輸入字符是所有組合,比如輸入a,b,c,則他們的組合有a,b,c,ab,ac,bc,abc。當交換字符串中兩個字符時,雖然能得到兩個不同排列,但只算一個組合。
如果輸入n個字符,則這n個字符能構成長度爲1,2....n的組合。在求n個字符長度爲m的組合時,我們把這n個字符分成兩部分:第一個字符和其餘的所有字符。如果組合裏包含第一個字符,則下一步在剩餘字符裏選取m-1個字符;如果組合裏不包含第一個字符,則下一步在剩餘n-1個字符裏選取m個字符。也就是說,求n個字符組成長度爲m的問題,可以分解爲:求n-1個字符中長度爲m-1的組合,求n-1個字符中長度爲m的組合。