916. 单词子集
我们给出两个单词数组 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]
。
class Solution {
public:
vector<string> wordSubsets(vector<string>& A, vector<string>& B) {
vector<vector<int>>mapa(A.size(),vector<int>(27,0));
vector<vector<int>>mapb(B.size(),vector<int>(27,0));
vector<int>table(27,0);
vector<string>ans;
for(int i = 0;i < A.size();i++)
for(int j = 0;j < A[i].size();j++)
mapa[i][A[i][j] - 'a']++;
for(int i = 0;i < B.size();i++){
for(int j = 0;j < B[i].size();j++)
mapb[i][B[i][j] - 'a']++;
for(int j = 0;j < 27;j++)
if(mapb[i][j] > table[j]) table[j] = mapb[i][j];
}
for(int i = 0;i < A.size();i++){
int flag = 1;
for(int j = 0;j < 27;j++){
if(table[j] != 0 && mapa[i][j] < table[j]){
flag = 0;
break;
}
}
if(flag == 1) ans.push_back(A[i]);
}
return ans;
}
};
解题思路:首先Leetcode中等难度的题目一般暴力都是过不了的,所以还是要有一些优化的,这题的话是利用B中对于每一个字母出现次数取最大值的方法构建一个table,这个table是用来存放B中每一个字母出现次数最大值,对于A中每一个的单词都必须满足table中每一个不等于0的字母出现的次数需要大于等于table中的次数,此时则放入ans中