面試題28:全排列
阿新 • • 發佈:2019-01-26
問題:輸入一個字串,打印出該字串中字元的所有排列。例如輸入字串abc,則打印出字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab,cba.
思路1:利用STL中的next_permutation(...)來直接實現該功能。要包含標頭檔案#include <algorithm>。
思路2:我們把一個字串看成兩個部分,第一部分為他的第一個字元,第二部分是後面所有的字元。我們求整個字串的排列,可以看成兩步,首先求出可能出現在第一個位置的字元,即把第一個字元和後面所有的字元交換。首先先固定第一個字元,求後面所有字元的排列。這個時候我們仍把後面的所有字元分成兩部分:後面字串的第一個字元,以及這個字元之後的所有字元。然後第一個字元逐一和它後面的字元交換。void STLnext_permutation(char *s1, int length) { do { cout<<s1<<endl; }while(next_permutation(s1, s1+length)); }
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; } } }