全排列 (C语言实现)
生活随笔
收集整理的這篇文章主要介紹了
全排列 (C语言实现)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
http://blog.csdn.net/v_july_v/article/details/6879101
轉(zhuǎn)自:http://blog.csdn.net/fanzitao/article/details/7879027
題目:輸入一個(gè)字符串,打印出該字符串中字符的所有排列。例如輸入字符串a(chǎn)bc,則輸出由字符a、b、c 所能排列出來的所有字符串
abc、acb、bac、bca、cab 和cba。
分析:此題最初整理于去年的微軟面試100題中第53題,第二次整理于微軟、Google等公司非常好的面試題及解答[第61-70題] 第67題。無獨(dú)有偶,這個(gè)問題今年又出現(xiàn)于今年的2011.10.09百度筆試題中。ok,接下來,咱們先好好分析這個(gè)問題。
一、遞歸實(shí)現(xiàn)
從集合中依次選出每一個(gè)元素,作為排列的第一個(gè)元素,然后對剩余的元素進(jìn)行全排列,如此遞歸處理,從而得到所有元素的全排列。以對字符串a(chǎn)bc進(jìn)行全排列為例,我們可以這么做:以abc為例
固定a,求后面bc的排列:abc,acb,求好后,a和b交換,得到bac
固定b,求后面ac的排列:bac,bca,求好后,c放到第一位置,得到cba
固定c,求后面ba的排列:cba,cab。代碼可如下編寫所示 #include<iostream> using namespace std; void Permutation(char* pStr, char* pBegin); void permutation(char* pStr) { Permutation(pStr, pStr); } void Permutation(char* pStr, char* pBegin) { if(!pStr || !pBegin) return; if(*pBegin == '\0') { printf("%s\n", pStr); } else { for(char* pCh = pBegin; *pCh != '\0'; ++ pCh) { // swap pCh and pBegin char temp = *pCh; *pCh = *pBegin; *pBegin = temp; Permutation(pStr, pBegin + 1); // restore pCh and pBegin temp = *pCh; *pCh = *pBegin; *pBegin = temp; } } } int main() { char str[] ={'a','b','c','d','\0'};permutation(str);getchar();return 0; }
總結(jié)
以上是生活随笔為你收集整理的全排列 (C语言实现)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 剑指offer 算法(树的两个节点的最低
- 下一篇: 求集合/字符串中的所有组合 (C语言)