一刷劍指offer(28)——字符串的排列

題目:
輸入一個字符串,打印出該字符串中字符的所有排列。例如輸入字符串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的組合。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章