美文网首页
916. 单词子集(Python)

916. 单词子集(Python)

作者: 玖月晴 | 来源:发表于2021-03-22 20:42 被阅读0次

难度:★★★☆☆
类型:字符串
方法:统计

题目

力扣链接请移步本题传送门
更多力扣中等题的解决方案请移步力扣中等题目录

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

解答

分析题目的规则是,如果单词b中各个单词的统计数量不超过单词a的,那么就可以说b是a的子集,无关于字母在单词中的顺序。

这道题看似需要嵌套循环,但是当我们把思路理清楚就会发现,对于字符串列表B,其实可以将其中的所有单词做一个合并,我们只需要统计一下各个单词中每个字母出现次数的最大值就好了,这样,整个的单词列表就可以仅仅看做单词b,进而用它去判断单词b是否为A列表中各个单词的子集,因为只要b是单词a的子集,那么B列表中的每个单词都是a的子集。

这也就是官网的解决方案,用一个长度为26的整数列表记录单词中各字符出现次数。

class Solution(object):
    def wordSubsets(self, A, B):
        def count(word):
            ans = [0] * 26
            for letter in word:
                ans[ord(letter) - ord('a')] += 1
            return ans

        bmax = [0] * 26
        for b in B:
            for i, c in enumerate(count(b)):
                bmax[i] = max(bmax[i], c)

        ans = []
        for a in A:
            if all(x >= y for x, y in zip(count(a), bmax)):
                ans.append(a)
        return ans

我们做一个代码上的合并简化,当然速度略有下降:

class Solution(object):
    def wordSubsets(self, A, B):
        def count(word):
            ans = [0] * 26
            for letter in word:
                ans[ord(letter) - ord('a')] += 1
            return ans

        bmax = [max(count(b)[i] for b in B) for i in range(26)]
        return filter(lambda word: all(ca >= cb for ca, cb in zip(count(word), bmax)), A)

如有疑问或建议,欢迎评论区留言~

有关更多力扣中等题的python解决方案,请移步力扣中等题解析

相关文章

网友评论

      本文标题:916. 单词子集(Python)

      本文链接:https://www.haomeiwen.com/subject/odwxqltx.html