LeetCode 916. 单词子集

916. 单词子集

题目描述提示帮助提交记录社区讨论阅读解答

随机一题


我们给出两个单词数组 A 和 B。每个单词都是一串小写字母。

现在,如果 b 中的每个字母都出现在 a 中,包括重复出现的字母,那么称单词 b 是单词 a 的子集。 例如,“wrr” 是 “warrior” 的子集,但不是 “world” 的子集。

如果对 B 中的每一个单词 bb 都是 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. 1 <= A.length, B.length <= 10000
  2. 1 <= A[i].length, B[i].length <= 10
  3. A[i] 和 B[i] 只由小写字母组成。
  4. A[i] 中所有的单词都是独一无二的,也就是说不存在 i != j 使得 A[i] == A[j]
class Solution {
public:
    vector<string> wordSubsets(vector<string>& A, vector<string>& B) {
        vector<vector<int>>mapa(A.size(),vector<int>(27,0));
        vector<vector<int>>mapb(B.size(),vector<int>(27,0));
        vector<int>table(27,0);
        vector<string>ans;
        for(int i = 0;i < A.size();i++)
            for(int j = 0;j < A[i].size();j++)
                mapa[i][A[i][j] - 'a']++;
        for(int i = 0;i < B.size();i++){
            for(int j = 0;j < B[i].size();j++)
                mapb[i][B[i][j] - 'a']++;
            for(int j = 0;j < 27;j++)
                if(mapb[i][j] > table[j]) table[j] = mapb[i][j];
        }
                
        
        for(int i = 0;i < A.size();i++){
            int flag = 1;
            for(int j = 0;j < 27;j++){
                if(table[j] != 0 && mapa[i][j] < table[j]){
                    flag = 0;
                    break;
                }
            }
            if(flag == 1) ans.push_back(A[i]);
        }
        return ans;
    }
};

解题思路:首先Leetcode中等难度的题目一般暴力都是过不了的,所以还是要有一些优化的,这题的话是利用B中对于每一个字母出现次数取最大值的方法构建一个table,这个table是用来存放B中每一个字母出现次数最大值,对于A中每一个的单词都必须满足table中每一个不等于0的字母出现的次数需要大于等于table中的次数,此时则放入ans中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值