LeetCode 916. 单词子集(C++、python)

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值