題目:輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串
abc,則輸出由字元a、
b、c所能排列出來的所有字串
abc、
acb、
bac、
bca、
cab和
cba。
分析:這是一道很好的考查對遞迴理解的程式設計題,因此在過去一年中頻繁出現在各大公司的面試、筆試題中。
我們以三個字元
abc為例來分析一下求字串排列的過程。首先我們固定第乙個字元
a,求後面兩個字元
bc的排列。當兩個字元
bc的排列求好之後,我們把第乙個字元
a和後面的
b交換,得到
bac,接著我們固定第乙個字元
b,求後面兩個字元
ac的排列。現在是把
c放到第一位置的時候了。記住前面我們已經把原先的第乙個字元
a和後面的
b做了交換,為了保證這次
c仍然是和原先處在第一位置的
a交換,我們在拿
c和第乙個字元交換之前,先要把b和
a交換回來。在交換b和
a之後,再拿
c和處在第一位置的
a進行交換,得到
cba。我們再次固定第乙個字元
c,求後面兩個字元b、
a的排列。
既然我們已經知道怎麼求三個字元的排列,那麼固定第乙個字元之後求後面兩個字元的排列,就是典型的遞迴思路了。
void permutation(char* pstr, char* pbegin);
///get the permutation of a string,
//for example, input string abc, its permutation is
//abc acb bac bca cba cab
/void permutation(char* pstr)
///print the permutation of a string,
//input: pstr - input string
// pbegin- points to the begin char of string
// whichwe want to permutate in this recursion
/void permutation(char* pstr, char* pbegin)
// otherwise, permute string
else }
}去掉重複的全排列
#include
using namespace std;
#include
//在[nbegin,nend)區間中是否有字元與下標為pend的字元相等
bool isswap(char*pbegin , char* pend)
returntrue;
}voidpermutation(char* pstr , char *pbegin)
else}}
}int main(void)
字串排列
在網上看到了乙個操作字串的題目,該題為 字串排列。大概意思是列出字串中所有字元的所有組合並且輸出無重複。自己做了一下,這裡分享該題的思路,和做法。自我覺得實現的有些麻煩 歡迎指點。問題輸入乙個字串,列印出該字串中字元的所有排列。輸入 字串abc。輸出 列印出由字元a,b,c所能排列出來的所有字串ab...
字串排列
輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。第一種方法 字串拼接 function permutate str else return result console.log pe...
字串的排列
一 題目 輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串abc,則列印出字元a,b,c所能排列出來的所有字串abc acb bac bca cab和cba。解答 看到這道題目似乎不知道該怎麼下手,可以採用遞迴方法,從第乙個字元開始,與後面的每乙個字元交換 abcbac cba然後對第二個字...