每日一題 掩碼求子集

2022-06-07 04:27:10 字數 1181 閱讀 3667

先來看78題

子集

給你乙個整數陣列nums ,陣列中的元素互不相同。返回該陣列所有可能的子集(冪集)。

解集不能包含重複的子集。你可以按任意順序返回解集。

遍歷位置掩碼即可得到子集

今日每日一題

猜字謎

外國友人仿照中國字謎設計了乙個英文版猜字謎小遊戲,請你來猜猜看吧。

字謎的迷面 puzzle 按字串形式給出,如果乙個單詞 word 符合下面兩個條件,那麼它就可以算作謎底:

單詞 word 中包含謎面 puzzle 的第乙個字母。

單詞 word 中的每乙個字母都可以在謎面 puzzle 中找到。

例如,如果字謎的謎面是 "abcdefg",那麼可以作為謎底的單詞有 "faced", "cabbage", 和 "baggage";而 "beefed"(不含字母 "a")以及 "based"(其中的 "s" 沒有出現在謎面中)。

返回乙個答案陣列 answer,陣列中的每個元素 answer[i] 是在給出的單詞列表 words 中可以作為字謎迷面 puzzles[i] 所對應的謎底的單詞數目。

由於puzzle和word都是小寫英文本串,所以這是乙個僅有26位的字符集掩碼問題。

本質上來說雖然word和puzzle裡的各字元出現次數和順序,但判定的依據都是出現的字元的集合。

故可以壓縮為字元掩碼。

由於頭部必有,所以只需要計算剩餘部分的子掩碼集合

for(int i = 1; i < 7; ++i)

mask |= (1 << puzzle[i]); //set bit

計算子集最終要轉變為子掩碼,故直接計算子掩碼也可。

關鍵**:

submask = mask;

dowhile(submask != mask);

這裡submask = (submask - 1) & mask 之所以能夠迭代submask而不重不漏,是因為submask的位模式是能夠與mask按位與後產生submask的最小二進位制數(聽起來像句廢話),所以再減去1就能得到與mask相與得到 更小的submask 的位模式。

字符集掩碼的全集的位模式由於並不是所有位都佔了,所以並不能用位置掩碼(全集的位模式是所有位置都為1)那一套來計算。

每日一題 LeetCode之子集

給定一組不含重複元素的整數陣列 nums,返回該陣列所有可能的子集 冪集 說明 解集不能包含重複的子集。示例 輸入 nums 1,2,3 輸出 3 1 2 1,2,3 1,3 2,3 1,2 思路 回溯演算法,以例子為例,每個位置都會出現1,2,3三種數字,那麼每一層就是乙個迴圈,選擇乙個數字,進入...

LeetCode每日一題 分割等和子集

題目 給定乙個只包含正整數的非空陣列。是否可以將這個陣列分割成兩個子集,使得兩個子集的元素和相等。注意 每個陣列中的元素不會超過 100 陣列的大小不會超過 200 示例 1 輸入 1,5,11,5 輸出 true 解釋 陣列可以分割成 1,5,5 和 11 示例 2 輸入 1,2,3,5 輸出 f...

每日一題 LeetCode之分割等和子集

給定乙個只包含正整數的非空陣列。是否可以將這個陣列分割成兩個子集,使得兩個子集的元素和相等。注意 每個陣列中的元素不會超過 100 陣列的大小不會超過 200 示例 1 輸入 1,5,11,5 輸出 true 解釋 陣列可以分割成 1,5,5 和 11 思路 令陣列總和為sum,將問題轉換為0 1揹...