給定乙個集合,輸出它的所有子集

2021-08-02 03:47:44 字數 933 閱讀 9130

題目:集合是由大字字母(a-z)組成的,要求輸出集合的所有子集,每個子集一行,不能使用遞迴。

例如 「abd」的子集:

null(空集)、a、b、c、ab、ac、bc、abc(共8個)

這個題可以用位圖的思想做。

比如集合{a,b} 對應位向量v=000...00011(26維)

那麼a表示1,b表示2,[0,3]迴圈(3是b在字母表的位置2+1計算得):

0 & v = 0  輸出null

1& v  =1 (000...0001)輸出a

2&v = 2 (000...0010)輸出b

3&v = 3 (000...0011)輸出ab

因此,我們可以得到下面的**:

#include #include #include #define n 26

int array[n / 32 + 1];//只用了乙個int

char *p = "abcdefghijklmnopqrstuvwxyz";

int maxelement(const char *s)//計算字串最大值,例如abdf最大為f,位於字母表第6個,輸出6

return res-'a'+1;

}void set(int x)

void initialization(const char *s)

void subset(const char *s, const int n)

{ int i,j;

int x = pow(2.0, maxelement(s));

int tmp = 0;

int mask = 1;

initialization(s);

printf("null\n");

for (i = 1; i < x; ++i)

{ tmp = i & array[0];

if (tmp

輸出乙個集合的所有子集

輸出字串的所有子集 如 對 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...

輸出乙個集合的所有子集(演算法)

輸出乙個集合的所有子集 演算法 時間複雜度很顯然,最少也是2 n,空間複雜度,是n,比較簡單 每個元素要麼在子集中,要麼不在,用 j 的二進位制形式的每一位代表陣列a中對應的位置的元素是否在子集中,例如,當i 5時,j i 5,那麼j 0101 我們對應的輸出 a 0 a 2 這個過程在while迴...