原题链接在这里:https://leetcode.com/problems/word-subsets/
题目:
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]
.
题解:
String a in A, if it is universal for every b in B, it must cover all the letters and max corresponding multiplicity in B.
Thus construct a map to maintain all letters and max corresponding multiplicity in B.
Then for each A, if it could cover this map, then add it to the res.
Time Complexity: O(m*n + p*q). m = A.length. n = average length of string in A. p = B.length. q = average length of string in B.
Space: O(1).
AC Java:
1 class Solution { 2 public List<String> wordSubsets(String[] A, String[] B) { 3 List<String> res = new ArrayList<>(); 4 if(A == null || A.length == 0){ 5 return res; 6 } 7 8 if(B == null || B.length == 0){ 9 return Arrays.asList(A); 10 } 11 12 int [] map = new int[26]; 13 for(String b : B){ 14 int [] bMap = new int[26]; 15 for(char c : b.toCharArray()){ 16 bMap[c - 'a']++; 17 } 18 19 for(int i = 0; i<26; i++){ 20 map[i] = Math.max(map[i], bMap[i]); 21 } 22 } 23 24 for(String a : A){ 25 int [] aMap = new int[26]; 26 for(char c : a.toCharArray()){ 27 aMap[c-'a']++; 28 } 29 30 boolean isNotSubSet = false; 31 for(int i = 0; i<26; i++){ 32 if(aMap[i] < map[i]){ 33 isNotSubSet = true; 34 break; 35 } 36 } 37 38 if(!isNotSubSet){ 39 res.add(a); 40 } 41 } 42 43 return res; 44 } 45 }