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;


    }
};

Last updated