Description
You are given two string arrays words1 and words2.
A string b is a subset of string a if every letter in b occurs in a including multiplicity.
For example, "wrr" is a subset of "warrior" but is not a subset of "world".
A string a from words1 is universal if for every string b in words2, b is a subset of a.
Return an array of all the universal strings in words1. You may return the answer in any order.
Example 1:
Input: words1 = ["amazon","apple","facebook","google","leetcode"], words2 = ["e","o"]
Output: ["facebook","google","leetcode"]
Example 2:
Input: words1 = ["amazon","apple","facebook","google","leetcode"], words2 = ["l","e"]
Output: ["apple","google","leetcode"]
Constraints:
1 <= words1.length, words2.length <= 10^4
1 <= words1[i].length, words2[i].length <= 10
words1[i] and words2[i] consist only of lowercase English letters.
All the strings of words1 are unique.
Solution
A little bit tricky and one take-away is: if the total time complexity is around 1 0 8 10^8 108, don't try it, it will be TLE.
The core idea is, we build a hashmap of words2
, and iterate all the strings in words1
to decide if we want to select it. The tricky part is how we build the hash map.
Because oo
won't be a subset of aeiou
, but ['ao', 'eo']
would be a subset of aeiou
, so to build the hash map, we just need to store the maximum frequency of the string in words2
.
Time complexity: o ( w o r d s 2. l e n + w o r d s 1. l e n ) o(words2.len + words1.len) o(words2.len+words1.len)
Space complexity: o ( 1 ) o(1) o(1)
Code
python3
class Solution:
def wordSubsets(self, words1: List[str], words2: List[str]) -> List[str]:
words2_fre = [0] * 26
for each_word in words2:
ch_cnt = collections.Counter(each_word)
for each_ch, each_cnt in ch_cnt.items():
ch_index = ord(each_ch) - ord('a')
words2_fre[ch_index] = max(words2_fre[ch_index], each_cnt)
res = []
for each_word in words1:
ch_cnt = collections.Counter(each_word)
is_candidate = True
for i in range(26):
if ch_cnt.get(chr(i + ord('a')), 0) < words2_fre[i]:
is_candidate = False
break
if is_candidate:
res.append(each_word)
return res