We are given two arrays A
and B
of words. Each word is a string of lowercase letters.
Now, say that word b
is a subset of word a
if every letter in b
occurs in a
, including multiplicity. For example, "wrr"
is a subset of "warrior"
, but is not a subset of "world"
.
Now say a word a
from A
is universal if for every b
in B
, b
is a subset of a
.
Return a list of all universal words in A
. You can return the words in any order.
Example 1:
Input: A = ["amazon","apple","facebook","google","leetcode"], B = ["e","o"] Output: ["facebook","google","leetcode"]
Example 2:
Input: A = ["amazon","apple","facebook","google","leetcode"], B = ["l","e"] Output: ["apple","google","leetcode"]
Example 3:
Input: A = ["amazon","apple","facebook","google","leetcode"], B = ["e","oo"] Output: ["facebook","google"]
Example 4:
Input: A = ["amazon","apple","facebook","google","leetcode"], B = ["lo","eo"] Output: ["google","leetcode"]
Example 5:
Input: A = ["amazon","apple","facebook","google","leetcode"], B = ["ec","oc","ceo"] Output: ["facebook","leetcode"]
思路: subset是子集的意思。然后一切就都简单了。暴力检索26个字母的数量满不满足就行。
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
vector<string> wordSubsets(vector<string>& A, vector<string>& B) {
int ch[26];
memset(ch,0,sizeof(ch));
int n1= B.size();
for(int i=0;i<n1;i++)
{
int tmp =B[i].size();
int c[26];
memset(c,0,sizeof(c));
for(int j=0;j<tmp;j++)
{
c[B[i][j]-'a']++;
}
for(int i=0;i<26;i++)
{
ch[i]=max(ch[i],c[i]);
}
}
n1 = A.size();
vector<string> ans;
for(int i=0;i<n1;i++)
{
int tmp =A[i].size();
int c[26];
memset(c,0,sizeof(c));
for(int j=0;j<tmp;j++)
{
c[A[i][j]-'a']++;
}
bool f=0 ;
for(int i=0;i<26;i++)
{
if(ch[i]>c[i]) f=1;
}
if(f==0) ans.push_back(A[i]);
}
return ans;
}
};