leetcode 1178 子集 狀態壓縮

2021-10-20 08:55:49 字數 1557 閱讀 2167

這個題是比較難的乙個題,每批輸入給的單詞數和謎題數都很多,o(n

2n^2

n2)是行不通的。由於題目中要求單詞中字母的多樣性要少於謎題,即匹配代表著單詞中的字母在謎題中都出現。所以我們預存所有單詞的表示到雜湊表中,同時計算謎題的所有子集(謎題長度最多7位)。這樣查詢謎題,就會變快。

這裡有兩個難點,乙個是字母的表示,由於每個字母最多一次,不需要用質數,這裡用bitmap即可。第二個是子集的獲取,可以用遞迴的演算法一行得出,這個也是很妙的地方。

from collections import defaultdict

class

solution

:def

findnumofvalidwords

(self, words: list[

str]

, puzzles: list[

str])-

> list[

int]

:def

subsets

(nums: list[

int])-

> list[list[

int]]:

res =[[

]]for num in nums:

res = res +

[[num]

+ i for i in res]

return res

defword2bitmap

(word)

: bitmap =

0 c0 = counter(word)

for c in c0:

num =

ord(c)

-ord

('a'

) bitmap +=(1

<< num)

return bitmap

ret =[0

for _ in puzzles]

# 構建word hashmap

bitmapcount = defaultdict(

int)

for word in words:

bitmap = word2bitmap(word)

bitmapcount[bitmap]+=1

for i, puzzle in

enumerate

(puzzles)

: first_c = puzzle[0]

c0 = counter(puzzle)

dis_puz =

for c in c0:

if c not

in first_c:

puzzs = subsets(dis_puz)

for puzz in puzzs:

bitmap = word2bitmap(puzz)

+ word2bitmap(

[first_c]

) ret[i]

+= bitmapcount[bitmap]

return ret

leetcode 1178 猜字謎(位運算)

外國友人仿照中國字謎設計了乙個英文版猜字謎小遊戲,請你來猜猜看吧。字謎的迷面 puzzle 按字串形式給出,如果乙個單詞 word 符合下面兩個條件,那麼它就可以算作謎底 單詞 word 中包含謎面 puzzle 的第乙個字母。單詞 word 中的每乙個字母都可以在謎面 puzzle 中找到。例如,...

LeetCode 子集問題

給定一組不含重複元素的整數陣列 nums,返回該陣列所有可能的子集 冪集 說明 解集不能包含重複的子集 class solution return a void findsubsets vector a,vector b,vector nums,int l,int k,int length for ...

leetcode 回溯 子集

方法一 迭代 class solution def subsets self,nums list int list list int res for i in nums res res i num for num in res 結果加上新的元素和結果匹配的 return resclass solut...