題目:輸入乙個字串,輸出該字串中字元的所有組合。舉個例子,如果輸入
abc,它的組合有a、
b、c、
ab、ac、
bc、abc。
分析:在本系列部落格的第
28題《
字串的排列
》中,我們詳細討論了如何用遞迴的思路求字串的排列。同樣,本題也可以用遞迴的思路來求字串的組合。
假設我們想在長度為
n的字串中求
m個字元的組合。我們先從頭掃瞄字串的第乙個字元。針對第乙個字元,我們有兩種選擇:一是把這個字元放到組合中去,接下來我們需要在剩下的
n-1個字元中選取
m-1個字元;而是不把這個字元放到組合中去,接下來我們需要在剩下的
n-1個字元中選擇
mvoid
combination(char* string)
} 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); }
由於組合可以是
1個字元的組合,
2個字元的字元……一直到
n個字元的組合,因此在函式
void combination(char* string)
,我們需要乙個
for迴圈。另外,我們乙個
vector
來存放選擇放進組合裡的字元。
程式設計師面試題精選100題 字串的排列 演算法
題目 輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串 abc,則輸出由字元a b c所能排列出來的所有字串 abc acb bac bca cab和 cba。分析 這是一道很好的考查對遞迴理解的程式設計題,因此在過去一年中頻繁出現在各大公司的面試 筆試題中。我們以三個字元abc為例來分析一...
程式設計師面試題精選100題
今天開始各種刷面試題,沉下心來集中時間,全身心投入 題目 輸入一棵二元查詢樹,將該二元查詢樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只調整指標的指向。比如將二元查詢樹 10 6 14 4 8 12 16 轉換成雙向鍊錶 4 6 8 10 12 14 16。相關概念 二元查詢樹 它首先要是...
程式設計師面試題精選
問題描述 輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串abc,則輸出由字元a b c所能排列出來的所有字串abc acb bac bca cab和cba。問題分析 這是一道很好的考查對遞迴理解的程式設計題。寫遞迴程式關鍵有兩點,處理好進入與返回的關係,進入時改變了什麼,返回時應當恢復。字...