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]
.
when we check whether wordA in A is a superset of wordB, we are individually checking the counts of letters: for each letter, N_letter(wordA) >= N_letter(wordB). this is the same as checking N_letter(wordA) >= max (N_letter(wordB))
in other words, reduce B to a single word bmax, then compare the counts of letters between words a in A, and bmax
time = O(A + B), A and B is the total amount of information in A and B respectively, space = O(A.length + B.length)
class Solution { public List<String> wordSubsets(String[] A, String[] B) { int[] bmax = new int[26]; for(String b : B) { int[] bCount = count(b); for(int i = 0; i < 26; i++) { bmax[i] = Math.max(bmax[i], bCount[i]); } } List<String> res = new ArrayList<>(); for(String a : A) { int[] aCount = count(a); for(int i = 0; i < 26; i++) { if(aCount[i] < bmax[i]) { break; } if(i == 25) { res.add(a); } } } return res; } public int[] count(String s) { int[] counter = new int[26]; for(char c : s.toCharArray()) { counter[c - 'a']++; } return counter; } }