916. Word Subsets - Medium
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 <= 100001 <= A[i].length, B[i].length <= 10A[i]andB[i]consist only of lowercase letters.- All words in
A[i]are unique: there isn'ti != jwithA[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; } }
浙公网安备 33010602011771号