Leecode每日一題 猜字謎

2021-10-20 10:21:42 字數 1492 閱讀 2881

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

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

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

首先要了解下面兩個位運算的公式:

a >> b & 1:檢查 a 的第 b 位是否為 1

a += 1 << b :將 a 的第 b 位設定為 1 ,前提是a的第b位原本是0,要不然會產生進製

然後就是將puzzle和word中的每一串字母轉換為二進位制,比如abc就轉換為000…000111(從右到左的1表示a,b,c。這串二進位制一共26位,使用int表示即可)。如果puzzle[1]=abc(二進位制表示為000…000111),word[2]=abb(二進位制表示為000…000011),將這兩個二進位制進行取&得到000…000011(就是word[2]),則可以說明word[2]是puzzle[1]的謎底。

將每一串字母轉換為二進位制:

int

getbin

(string str)

return t;

}

將word中每一串字母轉換成的二進位制串與str(puzz中的其中一串字母)轉換成的二進位制串進行&運算:

int

getcnt

(list

ws, string str)

return ans;

}

上述演算法時間複雜度過高無法通過,於是將思路轉換為列舉它所有可能的謎底,再去 words 裡面找每乙個謎底出現了多少次。(因為puzzle中的字母串固定了長度為7,時間複雜度就沒那麼高了)

int

getcnt

(map

map, string str)

// 查詢這樣的字元是否出現在 `words` 中,出現了多少次

if(map.

containskey

(u)) ans += map.

get(u);}

return ans;

}

比較難理解的是:if (((i >> (j - 1)) & 1) != 0) u += 1 << (cs[j] - 『a』)

比如puzzle[3]=00…1011110(首字母為b在第二位上)。先將首字母提取出來得到u=00…000010。假設此時i用二進位制表示為0001101,則j=1,3,4時執行u += 1 << (cs[j] - 『a』),執行完後u=00…1011010。此時word中的乙個二進位制串恰好為00…1011010,就執行相應的**。

Leecode每日一題 540 21

今天這題用python3做,實在太簡單了,可能用更底層的語言會複雜一些,並附上昨天打卡忘記mark的21題 給定乙個只包含整數的有序陣列,每個元素都會出現兩次,唯有乙個數隻會出現一次,找出這個數。示例 1 輸入 1,1,2,3,3,4,4,8,8 輸出 2 示例 2 輸入 3,3,7,7,10,11...

Leecode每日一題 單調數列

如果陣列是單調遞增或單調遞減的,那麼它是單調的。如果對於所有 i j,a i a j 那麼陣列 a 是單調遞增的。如果對於所有 i j,a i a j 那麼陣列 a 是單調遞減的。當給定的陣列 a 是單調陣列時返回 true,否則返回 false。示例 1 輸入 1,2,2,3 輸出 true 示例...

力扣演算法題 猜字謎

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