ETH官方钱包

前往
大廳
主題

LeetCode - 0916. Word Subsets 解題心得

Not In My Back Yard | 2023-07-06 12:00:07 | 巴幣 2 | 人氣 140

題目連結(jié):


題目意譯:
你被給定兩個(gè)字串陣列 words1 和 words2。

如果一字串 b 中每個(gè)字母都出現(xiàn)於另一字串 a 之中(重複字母要分開(kāi)算),則 b 為 a 的子集合。

例如,"wrr" 為 "warrior" 的一個(gè)子集合,但不是 "world" 的子集合。

如果 words1 中有一字串 a 滿(mǎn)足 words2 中的每一個(gè)字串 b 都是 a 的子集合,則我們將稱(chēng)呼 a 為「普遍的」。

回傳一個(gè)裝有所有 words1 中的普遍字串之陣列。你可以按任意順序來(lái)回傳。

限制:
1 ≦ words1.length, words2.length ≦ 10 ^ 4
1 ≦ words1[i].length, words2[i].length ≦ 10
words1[i] 和 words2[i] 只由小寫(xiě)英文字母組成。
words1 中的字串彼此相異。



範(fàn)例測(cè)資:
範(fàn)例 1:
輸入: words1 = ["amazon","apple","facebook","google","leetcode"], words2 = ["e","o"]
輸出: ["facebook","google","leetcode"]

範(fàn)例 2:
輸入: words1 = ["amazon","apple","facebook","google","leetcode"], words2 = ["l","e"]
輸出: ["apple","google","leetcode"]


解題思維:
首先我們觀察一下普遍字串有什麼特性:
假設(shè)現(xiàn)在有一個(gè)普遍字串為 "aaabbbbbcd",而其普遍於 "ac" 、 "bb" 、 "bbbb" 、 "aa" 這些字串。

根據(jù)定義,"dbabacbab" 或是 "cbdbbaaab" 等排列組合也是普遍字串。因此我們可以看到重要的不是字母的順序,而是數(shù)量。

單看字母 'a' 的話,我們的普遍字串有 3 個(gè) 'a'。而其他字串("ac" 、 "bb" 等)依序?yàn)?1 、 0 、 0 、 2 個(gè)。所以可以看到單就 'a' 來(lái)說(shuō),要成為普遍字串必須至少滿(mǎn)足 2 個(gè) 'a' 的「需求」(因?yàn)?2 是其餘字串中數(shù)量最大值)。

而其他字母也是同理,即要成為普遍字串至少要有 4 個(gè) 'b' 以及 1 個(gè) 'c'。



因此我們可以先掃過(guò) words2 中每個(gè)字串來(lái)統(tǒng)計(jì)每一種字母的最大「需求」。然後再掃過(guò) words1 中每一個(gè)字串 words1[i],看看 words1[i] 的每一種字母出現(xiàn)次數(shù)是否滿(mǎn)足需求。如果有,則 words1[i] 即為一個(gè)普遍字串;反之則不是。




此次分享到此為止,如有任何更加簡(jiǎn)潔的想法或是有說(shuō)明不清楚之地方,也煩請(qǐng)各位大大撥冗討論。

創(chuàng)作回應(yīng)

更多創(chuàng)作