LeetCode-916、单词子集-中等

LeetCode-916、单词子集-中等

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

 

代码1:

class Solution:
    def wordSubsets(self, A, B):
        re = []
        a = 0
        while a < len(A):
            b = 0
            while b < len(B):
                Bb_set = set(B[b])
                for i, Bb_str in enumerate(Bb_set):
                    if A[a].count(Bb_str) < B[b].count(Bb_str):
                        i -= 1
                        break
                if i == len(Bb_set)-1:
                    b += 1
                else:
                    break
            if b == len(B):
                re.append(A[a])
            a += 1
        return re

暴力方法,B很大时超出时间限制

 

代码2:

class Solution:
    def wordSubsets(self, A: List[str], B: List[str]) -> List[str]:
        b_str = []
        for b in B:
            b = list(b)
            b_set = set(b)
            for letter in b_set:
                while b.count(letter)-b_str.count(letter) >= 1:
                    b_str.append(letter)
        
        res = []
        for a in A:
            if len(a) < len(b_str):
                continue
            else:
                i = 0
                b_str_set = set(b_str)
                for letter in b_str_set:
                    if b_str.count(letter) > a.count(letter):
                        break
                    else:
                        i += 1
                if i == len(b_str_set):
                    res.append(a)
        
        return res

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值