leetcode Word Subsets

231 篇文章 0 订阅

We are given two arrays A and B of words.  Each word is a string of lowercase letters.

Now, say that word b is a subset of word a if every letter in b occurs in aincluding multiplicity.  For example, "wrr" is a subset of "warrior", but is not a subset of "world".

Now say a word a from A is universal if for every b in Bb is a subset of a

Return a list of all universal words in A.  You can return the words in any order.

 

Example 1:

Input: A = ["amazon","apple","facebook","google","leetcode"], B = ["e","o"]
Output: ["facebook","google","leetcode"]

Example 2:

Input: A = ["amazon","apple","facebook","google","leetcode"], B = ["l","e"]
Output: ["apple","google","leetcode"]

Example 3:

Input: A = ["amazon","apple","facebook","google","leetcode"], B = ["e","oo"]
Output: ["facebook","google"]

Example 4:

Input: A = ["amazon","apple","facebook","google","leetcode"], B = ["lo","eo"]
Output: ["google","leetcode"]

Example 5:

Input: A = ["amazon","apple","facebook","google","leetcode"], B = ["ec","oc","ceo"]
Output: ["facebook","leetcode"]

 

Note:

  1. 1 <= A.length, B.length <= 10000
  2. 1 <= A[i].length, B[i].length <= 10
  3. A[i] and B[i] consist only of lowercase letters.
  4. All words in A[i] are unique: there isn't i != j with A[i] == A[j].

Accepted

15,865

Submissions

34,051

--------------------------------------------------------------------------------

TLE code without merging required characters:

from collections import Counter

class Solution:
    def a_contains_b(self, a, b):
        for k,v in b.items():
            if (k not in a or (k in a and a[k] < v)):
                return False
        return True

    def contains_all(self, a, b_list):
        for b in b_list:
            is_contain = self.a_contains_b(a,b)
            if (is_contain == False):
                return False
        return True

    def wordSubsets(self, A, B):
        b_list = []
        for b in B:
            b_list.append(Counter(b))
        res = []
        for a in A:
            c_a = Counter(a)
            if (self.contains_all(c_a, b_list)):
                res.append(a)
        return res

s = Solution()
print(s.wordSubsets(["amazon","apple","facebook","google","leetcode"],["l","e"]))

Merge required characters:

from collections import Counter

class Solution:
    def a_contains_b(self, a, b):
        for k,v in b.items():
            if (k not in a or (k in a and a[k] < v)):
                return False
        return True

    def wordSubsets(self, A, B):
        required_letter = Counter()
        for b in B:
            b_c = Counter(b)
            for k,v in b_c.items():
                if (k not in required_letter or (k in required_letter and required_letter[k] < v)):
                    required_letter[k] = v
        res = []
        for a in A:
            c_a = Counter(a)
            if (self.a_contains_b(c_a, required_letter)):
                res.append(a)
        return res

s = Solution()
print(s.wordSubsets(["amazon","apple","facebook","google","leetcode"],["e","o"]))

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值