題目描述:
輸出含有n個元素集合的所有子集。例如,三個元素的所有子集是:{},,,,,,,.
輸入:abc
輸出:cba
bacaacb
bcnull
解題思路:
遞迴思路:
* 例如:對於集合來說,我們如果獲得它的所有子集,我們可以分兩部分:
* 1.獲取集合的所有子集(問題規模見減小)
* 2.的所有子集中都新增進入a
* 這兩部分的和,恰好是整個集合的子集
public static listsubset(string str)
//獲取str中,除去第乙個元素後,子串的所有元素的子集
listsublist=subset(str.substring(1));
for(string string:sublist)else
} list.addall(sublist);//合併這兩個部分
return list;
}
執行:
public static void main(string args)
}
結果:
子集的數目:32
edcba
dcba
ecba
cbaedba
dbaeba
baedca
dcaeca
caeda
daea
aedcb
dcbecb
cbedb
dbeb
bedc
dcecced
denull
關於遞迴的一點感悟:
1.先弄清楚遞迴的順序。在遞迴的實現中,通常假設後續的呼叫已經完成,在此基礎上,才實現遞迴的邏輯。在該題中,我們假設子串的所有子集已經求出的情況下,再將第乙個元素新增進去,再進行合併。
2.分析清楚遞迴的邏輯
3.考慮好遞迴的退出條件,也就是邊界條件。
集合的所有子集
假設集合a 它的所有集合是 表示空集 可以這樣理解這張圖,從集合a的每個元素自身分析,它只有兩種狀態,或是某個子集的元素,或是不屬於任何子集,所以求子集的過程就可以看成對每個元素進行 取捨 的過程。n個元素有2的n次方個組合 每一層左邊節點表示加入該層元素,右邊表示不加入。第二層表示對第1個元素的處...
輸出乙個集合的所有子集
輸出字串的所有子集 如 對 abc 輸出 c b bc a ac ab abc 第一種做法 2 n 遍歷每個字元,每個字元只能取或者不取。取就把該字元加入結果中,遍歷完畢後,輸出結果字串。如下 main.cpp 輸出乙個集合的所有子集 created by zjl on 16 8 10.includ...
輸出乙個集合的所有子集合
面試遇上了這個問題,思量了會,想到用遞迴的方式解決這個問題。回來網上搜尋了下,發現通過二進位制的思想來解決這個問題更容易,下面我把兩種解決方式的思想及原碼分享出來。我們都知道,乙個含n個元素的集合擁有2 n個子集合,並且不難發現,其中每個子集合都是從0到2 n 1 每個數的二進位制格式中0 放棄,1...