We are given two arrays A
and B
of words. Each word is a string of lowercase letters.
Now, say that word b
is a subset of word 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"
.
Now say a word a
from A
is universal if for every b
in B
, b
is a subset of a
.
Return a list of all universal words in A
. You can return the words in any order.
Example 1:
Input: A = ["amazon","apple","facebook","google","leetcode"], B = ["e","o"] Output: ["facebook","google","leetcode"]
Example 2:
Input: A = ["amazon","apple","facebook","google","leetcode"], B = ["l","e"] Output: ["apple","google","leetcode"]
Example 3:
Input: A = ["amazon","apple","facebook","google","leetcode"], B = ["e","oo"] Output: ["facebook","google"]
Example 4:
Input: A = ["amazon","apple","facebook","google","leetcode"], B = ["lo","eo"] Output: ["google","leetcode"]
Example 5:
Input: A = ["amazon","apple","facebook","google","leetcode"], B = ["ec","oc","ceo"] Output: ["facebook","leetcode"]
Note:
1 <= A.length, B.length <= 10000
1 <= A[i].length, B[i].length <= 10
A[i]
andB[i]
consist only of lowercase letters.- All words in
A[i]
are unique: there isn'ti != j
withA[i] == A[j]
.
Accepted
15,865
Submissions
34,051
--------------------------------------------------------------------------------
TLE code without merging required characters:
from collections import Counter
class Solution:
def a_contains_b(self, a, b):
for k,v in b.items():
if (k not in a or (k in a and a[k] < v)):
return False
return True
def contains_all(self, a, b_list):
for b in b_list:
is_contain = self.a_contains_b(a,b)
if (is_contain == False):
return False
return True
def wordSubsets(self, A, B):
b_list = []
for b in B:
b_list.append(Counter(b))
res = []
for a in A:
c_a = Counter(a)
if (self.contains_all(c_a, b_list)):
res.append(a)
return res
s = Solution()
print(s.wordSubsets(["amazon","apple","facebook","google","leetcode"],["l","e"]))
Merge required characters:
from collections import Counter
class Solution:
def a_contains_b(self, a, b):
for k,v in b.items():
if (k not in a or (k in a and a[k] < v)):
return False
return True
def wordSubsets(self, A, B):
required_letter = Counter()
for b in B:
b_c = Counter(b)
for k,v in b_c.items():
if (k not in required_letter or (k in required_letter and required_letter[k] < v)):
required_letter[k] = v
res = []
for a in A:
c_a = Counter(a)
if (self.a_contains_b(c_a, required_letter)):
res.append(a)
return res
s = Solution()
print(s.wordSubsets(["amazon","apple","facebook","google","leetcode"],["e","o"]))