題目:輸入乙個字串,輸出該字串中字元的所有組合。舉個例子,如果輸入
abc,它的組合有a、
b、c、
ab、ac、
bc、abc。
分析:在本系列部落格的第
28題《
字串的排列
》中,我們詳細討論了如何用遞迴的思路求字串的排列。同樣,本題也可以用遞迴的思路來求字串的組合。
假設我們想在長度為
n的字串中求
m個字元的組合。我們先從頭掃瞄字串的第乙個字元。針對第乙個字元,我們有兩種選擇:一是把這個字元放到組合中去,接下來我們需要在剩下的
n-1個字元中選取
m-1個字元;而是不把這個字元放到組合中去,接下來我們需要在剩下的
n-1個字元中選擇
m
#include#includeusing namespace std;
void combination(char* string, int number, vector& result)
if(*string == '\0')
return;
result.push_back(*string);
combination(string + 1, number - 1, result);
result.pop_back();
combination(string + 1, number, result);
}void combination(char* string)
}
int main()
由於組合可以是
1個字元的組合,
2個字元的字元……一直到
n個字元的組合,因此在函式
void combination(char* string)
,我們需要乙個
for迴圈。另外,我們乙個
vector
來存放選擇放進組合裡的字元。
01 輸出字串中字元的所有組合
1 def perm s 2 這裡是遞迴函式的出口,為什麼呢,因為這裡表示 乙個長度為1的字串,它的排列組合就是它自己。3if len s 1 4return s 5 sl 儲存字串的所有可能排列組合 6for i in range len s 這個迴圈,對應 解題思路1 確定字串的第乙個字母是誰,...
求字串的所有組合輸出
劍指offer一書中面試題28求字串的排列,給出了遞迴演算法程式。其中擴充套件題目中提到了,求字串的所有組合。比如輸入字串 abc 輸出應為 a b c ab ac bc abc.借用書上的解題思路 如果輸入n個字元,則這n個字元能構成長度為1 長度為2 長度為n的組合。在求長度為m的組合時,可考慮...
如何輸出字串的所有組合
問題描述 假如字串中所有字元都不重複,如何輸出字串的所有組合。例如 abca,結果應是a,b,c,ab,ac,bc,abc。最容易想到的就是遞迴了,但效率會變得很差,因為棧被呼叫了2 n次方,為了提高效率,可以構造乙個長度為n的01字串,表示輸出結果中是否包含某個字元,例如 001 c,010 b,...