這個題是比較難的乙個題,每批輸入給的單詞數和謎題數都很多,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...