1. 程式人生 > >面試題28:全排列

面試題28:全排列

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

思路1:利用STL中的next_permutation(...)來直接實現該功能。要包含標頭檔案#include <algorithm>。

void STLnext_permutation(char *s1, int length)
{
    do
    {
        cout<<s1<<endl;
    }while(next_permutation(s1, s1+length));
    
}
思路2:我們把一個字串看成兩個部分,第一部分為他的第一個字元,第二部分是後面所有的字元。我們求整個字串的排列,可以看成兩步,首先求出可能出現在第一個位置的字元,即把第一個字元和後面所有的字元交換。首先先固定第一個字元,求後面所有字元的排列。這個時候我們仍把後面的所有字元分成兩部分:後面字串的第一個字元,以及這個字元之後的所有字元。然後第一個字元逐一和它後面的字元交換。
void permutation(char *s,char *pBegin)
{
    if(*pBegin == '\0')
    {
        cout<<s<<endl;
    }
    else
    {
        for(char* pCh = pBegin; *pCh != '\0'; ++pCh)
        {
            char temp = *pCh;
            *pCh = *pBegin;
            *pBegin = temp;
            
            permutation(s, pBegin + 1);
            
            temp = *pCh;
            *pCh = *pBegin;
            *pBegin = temp;
            
        }
    }
    
}