力扣演算法題 猜字謎

2022-08-10 20:21:10 字數 3354 閱讀 8883

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

字謎的迷面 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'。

1 <= words.length <= 10^5

4 <= words[i].length <= 50

1 <= puzzles.length <= 10^4

puzzles[i].length == 7

words[i][j], puzzles[i][j] 都是小寫英文本母。

每個 puzzles[i] 所包含的字元都不重複。

第一種思路:

暴力解,

把puzzle和word都轉集合,然後逐個判斷word的每個字母是不是都在puzzle裡出現過。

1

class

solution(object):

2def

findnumofvalidwords(self, words, puzzles):

3"""

4:type words: list[str]

5:type puzzles: list[str]

6:rtype: list[int]

7"""

8 res =

9for p in

puzzles:

10 record_p =set(p)

11 cnt =0

12for word in

words:

13 set_word =set(word)

14if p[0] not

inset_word:

15continue

16 flag =0

17for char in

set_word:

18if char not

inrecord_p:

19 flag = 1

20break

21if

notflag:

22 cnt += 123#

print cnt, flag

2425

return res

第二種思路:

首先要明確一點,words裡的word都可以轉化成乙個pattern,

比如 「aaaa」實際上等價於 pattern "a", 「baaaa」 == pattern "ab", 「ababbabaabb」 == pattern"ab",

所以先把所有的word,轉成pattern之後,再統計所有pattern出現的頻率。

接著,對於所有的puzzle,我們可以生成它的全部子集,

因為題目給定puzzle的長度為7,而且要求puzzle[0]必須出現在有效的子集裡,

所以一共可以生成 2 ^ 6 = 64種組合結果,即除下標為0外的每一位都出現或者不出現在子集中。

生成完全部有效的組合之後,對於每個有效組合,

再在pattern的統計頻率的字典裡查詢,當前的組合有沒有出現過,如果出現過,就把對應頻率加在答案裡。

1

class

solution(object):

2def

findnumofvalidwords(self, words, puzzles):

3"""

4:type words: list[str]

5:type puzzles: list[str]

6:rtype: list[int]

7"""

8from collections import

counter

9for i in

range(len(words)):

10 words[i] = ""

.join(sorted(set(words[i])))

11 record = counter(words) #

統計每種pattern出現的頻率

1213 res =

14for p in

puzzles:

15 bfs = [p[0]] #

固定首字母

16for char in p[1:]:

17 bfs += [s + char for s in bfs] #

生成64種可能

18 cnt =0

19for combination in

bfs:

20 tmp = ""

.join(sorted(combination))

21if tmp in record: #

看看當前pattern在words裡有沒有出現過

22 cnt +=record[tmp]

2324

return res

力扣 1178 猜字謎 位運算 思維

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

力扣1178 猜字謎 C語言實現 困難題

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

Leecode每日一題 猜字謎

字謎的迷面 puzzle 按字串形式給出,如果乙個單詞 word 符合下面兩個條件,那麼它就可以算作謎底 例如,如果字謎的謎面是 abcdefg 那麼可以作為謎底的單詞有 faced cabbage 和 baggage 而 beefed 不含字母 a 以及 based 其中的 s 沒有出現在謎面中 ...