题目
我们给出两个单词数组 A 和 B。每个单词都是一串小写字母。
现在,如果 b 中的每个字母都出现在 a 中,包括重复出现的字母,那么称单词 b 是单词 a 的子集。 例如,“wrr” 是 “warrior” 的子集,但不是 “world” 的子集。
如果对 B 中的每一个单词 b,b 都是 a 的子集,那么我们称 A 中的单词 a 是通用的。
你可以按任意顺序以列表形式返回 A 中所有的通用单词。
示例 1:
输入:A = [“amazon”,“apple”,“facebook”,“google”,“leetcode”], B = [“e”,“o”]
输出:[“facebook”,“google”,“leetcode”]
示例 2:
输入:A = [“amazon”,“apple”,“facebook”,“google”,“leetcode”], B = [“l”,“e”]
输出:[“apple”,“google”,“leetcode”]
示例 3:
输入:A = [“amazon”,“apple”,“facebook”,“google”,“leetcode”], B = [“e”,“oo”]
输出:[“facebook”,“google”]
示例 4:
输入:A = [“amazon”,“apple”,“facebook”,“google”,“leetcode”], B = [“lo”,“eo”]
输出:[“google”,“leetcode”]
示例 5:
输入:A = [“amazon”,“apple”,“facebook”,“google”,“leetcode”], B = [“ec”,“oc”,“ceo”]
输出:[“facebook”,“leetcode”]
提示:
1 <= A.length, B.length <= 10000
1 <= A[i].length, B[i].length <= 10
A[i] 和 B[i] 只由小写字母组成。
A[i] 中所有的单词都是独一无二的,也就是说不存在 i != j 使得 A[i] == A[j]。
民间解法
1.由于每个符合条件的a都要满足所有的b,可以先整合一下所有b的条件
2.本题的条件本质是单词包含的字符个数是否符合所有的b
3.因此可以整合所有b的每个字符最大的字符个数
4.最后对应a中的字符个数是否超过条件就可以了
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 我们给出两个单词数组 A 和 B。每个单词都是一串小写字母。
*
* 现在,如果 b 中的每个字母都出现在 a 中,包括重复出现的字母,那么称单词 b 是单词 a 的子集。
* 例如,“wrr” 是 “warrior” 的子集,但不是 “world” 的子集。
*
* 如果对 B 中的每一个单词 b,b 都是 a 的子集,那么我们称 A 中的单词 a 是通用的。
*
* 你可以按任意顺序以列表形式返回 A 中所有的通用单词。
*
*/
public class Solution916 {
public List<String> wordSubsets(String[] words1, String[] words2) {
List<String> result = new ArrayList<>();
Map<Character, Integer> map2 = new HashMap<>();
for (String word2 : words2) {
Map<Character, Integer> map = countWord(word2);
for (char c : map.keySet()) {
if (map2.containsKey(c) && map.get(c) <= map2.get(c)) {
continue;
}
map2.put(c, map.get(c));
}
}
for (String word1 : words1) {
Map<Character, Integer> map1 = countWord(word1);
boolean flag = true;
for (char c : map2.keySet()) {
if (map1.containsKey(c) && map1.get(c) >= map2.get(c)) {
continue;
}
flag = false;
break;
}
if (flag) {
result.add(word1);
}
}
return result;
}
public Map<Character, Integer> countWord(String word) {
Map<Character, Integer> map = new HashMap<>();
for (int i=0; i<word.length(); i++) {
char c = word.charAt(i);
if (map.containsKey(c)) {
map.put(c, map.get(c) + 1);
} else {
map.put(c, 1);
}
}
return map;
}
}