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]
.
题目理解:
定义字符串a包含字符串b:对于每一个字母,a中出现的次数大于等于b中出现的次数。给定字符串数组A和B,找出A中所有满足条件的字符串a,a包含B中所有的字符串
解题思路:
如果a包含B中的所有字符串,那么a一定满足最严格的条件,即对于每一个字母,a中出现的次数,大于B中任意一个字符串中出现的次数,换句话说,大于B中这个字母出现次数最多的字符串中出现的次数。
因此字需要记录所有字母,在B中出现的最大次数,满足出现字母数量大于这些最大次数的字符串就是我们要找的
class Solution {
public List<String> wordSubsets(String[] A, String[] B) {
int[] record = new int[26];
for(String str : B){
int[] local = new int[26];
for(char ch : str.toCharArray())
local[ch - 'a']++;
for(int i = 0; i < 26; i++)
record[i] = Math.max(record[i], local[i]);
}
List<String> res = new ArrayList<>();
for(String str : A){
int[] local = new int[26];
for(char ch : str.toCharArray())
local[ch - 'a']++;
boolean flag = true;
for(int i = 0; i < 26 && flag; i++)
if(local[i] < record[i])
flag = false;
if(flag)
res.add(str);
}
return res;
}
}