题目描述
我们给出两个单词数组 A 和 B。每个单词都是一串小写字母。
现在,如果 b 中的每个字母都出现在 a 中,包括重复出现的字母,那么称单词 b 是单词 a 的子集。 例如,“wrr” 是 “warrior” 的子集,但不是 “world” 的子集。
如果对 B 中的每一个单词 b,b 都是 a 的子集,那么我们称 A 中的单词 a 是通用的。
算法
就用Counter来存匹配串B中的频率,
如果A里有就返回
vector<string> wordSubsets(vector<string>& A, vector<string>& B) {
vector<int> count(26), tmp(26);
int i;
for (string b : B) {
tmp = counter(b);
for (i = 0; i < 26; ++i)
count[i] = max(count[i], tmp[i]);
}
vector<string> res;
for (string a : A) {
tmp = counter(a);
for (i = 0; i < 26; ++i)
if (tmp[i] < count[i])
break;
if (i == 26) res.push_back(a);
}
return res;
}
vector<int> counter(string& word) {
vector<int> count(26);
for (char c : word) count[c - 'a']++;
return count;
}
Python 代码
def wordSubsets(self, A: List[str], B: List[str]) -> List[str]:
cnt = collections.Counter()
for b in B:
cnt |= collections.Counter(b) # 都加上 二进制中有一个1就加上
return [a for a in A if not cnt - Counter(a)]