# 916.Word Subsets

**916.Word Subsets**

> 我们给出两个单词数组 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]。
```

方法： 通过统计26个小写字母的词频来判断是否一个单词包含另一个单词，词频都大于等于则包含。

1. 对A向量创建一个二维向量，长度为A的size，每个向量有26个元素，表示26个小写字母，初始化词频为0。
2. 对向量B也可以这么做，但之后判断时候则会有两层循环，导致时间复杂度增加，而另一方面，由于B的每个元素都被A中某个单词包含，则B中每个元素词频的最大值也小于等于A中某个元素词频，因此只需要对B创建一个一维向量，表示B中所有元素的字母的词频最大值。
3. 循环遍历A中每个元素，统计各个元素中每个字母词频。
4. 循环遍历B中每个元素，并用一个向量保存每个元素中每个字母词频最大值。
5. 遍历A中每个元素，判断：从'a'到'z'的所有字母词频，如果存在B中的最大词频大于A的某个单词，则跳出循环。
6. 判断是否已经遍历到最后一个字母，如果是，则表明A中该元素包含了B，将其压入result向量中。
7. 继续循环，最后返回result向量。

```
class Solution {
public:
    vector<string> wordSubsets(vector<string>& A, vector<string>& B) {
        int sizeA = A.size();
        int sizeB = B.size();
        vector<vector<int>> alphaA(sizeA,vector<int>(26,0));

        vector<int> alphaB1(26,0);
        vector<string> result;
        for(int i=0;i<sizeA;i++)
        {
            int sizeA1=A[i].size();
            for(int j=0;j<sizeA1;j++)
            {
                alphaA[i][A[i][j]-'a']++;
            }

        }
            for(int i=0;i<sizeB;i++)
        {
            int sizeB1=B[i].size();
            vector<int> alphaB0(26,0);
            for(int j=0;j<sizeB1;j++)
            {
                alphaB0[B[i][j]-'a']++;
            }
            for(int j=0;j<26;j++)
                alphaB1[j] = (alphaB0[j] > alphaB1[j])?alphaB0[j]:alphaB1[j];

        }

        for(int i=0;i<sizeA;i++)
        {
            int j=0;
            for(j;j<26;j++)
            {
                if(alphaB1[j] > alphaA[i][j]) break;
            }


            if(j == 26)
                result.push_back(A[i]);
        }
        return result;


    }
};
```
