劍指offer一書中面試題28求字串的排列,給出了遞迴演算法程式。其中擴充套件題目中提到了,求字串的所有組合。比如輸入字串:「abc」,輸出應為:a、b、c、ab、ac、bc、abc.
借用書上的解題思路:如果輸入n個字元,則這n個字元能構成長度為1、長度為2、......長度為n的組合。在求長度為m的組合時,可考慮將這n個字元分成兩部分:第乙個字元和其餘所有的字元。如果組合裡包含第乙個字元,則下一步在剩餘的字元裡選取m-1個字元;如果不包含第乙個字元,則下一步在剩餘的字元裡選取m個字元。
思想比較簡單巧妙,下面是我給出的實現**:
#include "stdafx.h"
#include
#include
using namespace std;
void combine(int ilen,char* pstart,char* pend,string strbefore)
else
printf("%s\n",pstart);
}else
}else}}
}void combine(char* pstr,int ilen)
char* pend=pstr+ilen-1;
string strb;
for (int i=1;i<=ilen;i++)
combine(i,pstr,pend,strb);}}
int _tmain(int argc, _tchar* argv)
執行結果如圖:
求字串的所有組合
問題 求乙個字串的所有組合。解答 題意很清楚,是求乙個字串的所有組合,屬於中學數學知識的範疇,如給定字串str abc 則他的所有組合有 a b c ab ac bc abc。交換兩個字元時雖然能得到兩個不同的排列,但是卻屬於同乙個組合,比如ab和ba是不同的排列,但是只能算乙個組合。include...
輸出該字串中字元的所有組合
題目 輸入乙個字串,輸出該字串中字元的所有組合。舉個例子,如果輸入 abc,它的組合有a b c ab ac bc abc。分析 在本系列部落格的第 28題 字串的排列 中,我們詳細討論了如何用遞迴的思路求字串的排列。同樣,本題也可以用遞迴的思路來求字串的組合。假設我們想在長度為 n的字串中求 m個...
如何輸出字串的所有組合
問題描述 假如字串中所有字元都不重複,如何輸出字串的所有組合。例如 abca,結果應是a,b,c,ab,ac,bc,abc。最容易想到的就是遞迴了,但效率會變得很差,因為棧被呼叫了2 n次方,為了提高效率,可以構造乙個長度為n的01字串,表示輸出結果中是否包含某個字元,例如 001 c,010 b,...