leetcode 1178 猜字謎(位運算)

2021-10-20 11:27:13 字數 1377 閱讀 3082

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

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

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

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

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

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

示例:輸入:

words = [「aaaa」,「asas」,「able」,「ability」,「actt」,「actor」,「access」],

puzzles = [「aboveyz」,「abrodyz」,「abslute」,「absoryz」,「actresz」,「gaswxyz」]

輸出:[1,1,3,2,4,0]

解釋:1 個單詞可以作為 「aboveyz」 的謎底 : 「aaaa」

1 個單詞可以作為 「abrodyz」 的謎底 : 「aaaa」

3 個單詞可以作為 「abslute」 的謎底 : 「aaaa」, 「asas」, 「able」

2 個單詞可以作為 「absoryz」 的謎底 : 「aaaa」, 「asas」

4 個單詞可以作為 「actresz」 的謎底 : 「aaaa」, 「asas」, 「actt」, 「access」

沒有單詞可以作為 「gaswxyz」 的謎底,因為列表中的單詞都不含字母 『g』。

將word單詞壓縮成int型別,通過列舉puzzle的子集,匹配對應的word

class

solution

if(integer.

bitcount

(mask)

<=7)

map.

put(mask,map.

getordefault

(mask,0)

+1);

} list

list=

newarraylist

<

>()

;for

(string puzzle : puzzles)

int sub=mask;

dowhile

(sub!=mask)

; list.

add(cur);}

return list;

}}

力扣 1178 猜字謎 位運算 思維

思路 看完題目會發現關鍵點是乙個單詞 現的字元種類,和個數沒有關係,那麼我們可以用位運算表示某個單詞含有的字元種類。具體做法是,如果它含有小寫字母x xx,我們就可以把它二進位制表示的第x a x a x a 位置為1 11。這樣就將字串變成了整數,接下來構建乙個雜湊表,記錄某個整數所對應的字串個數...

leetcode 1178 子集 狀態壓縮

這個題是比較難的乙個題,每批輸入給的單詞數和謎題數都很多,o n 2n 2 n2 是行不通的。由於題目中要求單詞中字母的多樣性要少於謎題,即匹配代表著單詞中的字母在謎題中都出現。所以我們預存所有單詞的表示到雜湊表中,同時計算謎題的所有子集 謎題長度最多7位 這樣查詢謎題,就會變快。這裡有兩個難點,乙...

猜字謎遊戲

include include include int main void printf 請輸入四個不重複的數字 n for else printf da db m,n 猜數字 系統在0 9中隨機生成不重複四個數排列成四位數,然後讓猜數者每次通過從0 9中任選四個數字來猜使用的是哪四個數字和這四個數...