LeetCode 916. Word Subsets

原题链接在这里: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 Bb 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. 1 <= A.length, B.length <= 10000
  2. 1 <= A[i].length, B[i].length <= 10
  3. A[i] and B[i] consist only of lowercase letters.
  4. All words in A[i] are unique: there isn't i != j with A[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 }

 

posted @ 2019-12-06 08:07  Dylan_Java_NYC  阅读(353)  评论(0编辑  收藏  举报