我们给出两个单词数组 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]
。
C++
class Solution {
public:
vector<string> wordSubsets(vector<string>& A, vector<string>& B)
{
vector<string> res;
int m=A.size();
int n=B.size();
vector<vector<int>> tmp(m,vector<int>(26,0));
vector<vector<int>> tmpB(n,vector<int>(26,0));
vector<int> mm(26,0);
for(int i=0;i<m;i++)
{
for(int j=0;j<A[i].size();j++)
{
tmp[i][A[i][j]-'a']++;
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<B[i].size();j++)
{
tmpB[i][B[i][j]-'a']++;
}
for(int j=0;j<26;j++)
{
mm[j]=max(mm[j],tmpB[i][j]);
}
}
for(int i=0;i<m;i++)
{
int flag=1;
for(int j=0;j<26;j++)
{
if(tmp[i][j]<mm[j] && mm[j]!=0)
{
flag=0;
break;
}
}
if(flag)
{
res.push_back(A[i]);
}
}
return res;
}
};
python
class Solution:
def wordSubsets(self, A, B):
"""
:type A: List[str]
:type B: List[str]
:rtype: List[str]
"""
m=len(A)
n=len(B)
res=[]
tmp=[[0 for j in range(26)] for i in range(m)]
tmpB=[[0 for j in range(26)] for i in range(n)]
mm=[0 for i in range(26)]
for i in range(m):
for j in range(len(A[i])):
tmp[i][ord(A[i][j])-ord('a')]+=1
for i in range(n):
for j in range(len(B[i])):
tmpB[i][ord(B[i][j])-ord('a')]+=1
for j in range(26):
mm[j]=max(mm[j],tmpB[i][j])
for i in range(m):
flag=1
for j in range(26):
if mm[j]!=0 and mm[j]>tmp[i][j]:
flag=0
break
if flag:
res.append(A[i])
return res