题目描述
我们给出两个单词数组 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]。
解题思路:
对于任意一个字母,它在B中单词中出现的最大次数,不能大于它在A中单词中的出现次数,否则这个A中的单词就不是符合要求的“通用单词”。
利用B中对于每一个字母出现次数取最大值的方法构建一个table,这个table是用来存放B中每一个字母出现次数最大值,对于A中每一个的单词都必须满足table中每一个不等于0的字母出现的次数需要大于等于table中的次数,此时则放入ret中
代码示例(C++):
class Solution {
public:
vector<string> wordSubsets(vector<string>& A, vector<string>& B) {
vector<vector<int> > mapa(A.size(), vector<int>(26, 0));
vector<vector<int> > mapb(A.size(), vector<int>(26, 0));
vector<int> table(26, 0);
vector<string> ret;
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 < 26; ++j) {
if (mapb[i][j] > table[j])
table[j] = mapb[i][j];
}
}
for (int i = 0; i < A.size(); ++i) {
bool flag = true;
for (int j = 0; j < 26; ++j) {
if (table[j] != 0 && mapa[i][j] < table[j]) {
flag = false;
break;
}
}
if (flag)
ret.push_back(A[i]);
}
return ret;
}
};