题目描述
我们给出两个单词数组 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"]
解题思路:
既然要求A中每个字符串都是B中的超集,说明要求B中元素出现次数最多的保存起来就行,然后对A中元素,如果每个元素的值均大于等于对应的值。
这里以A = ["amazon","apple","facebook","google","leetcode"],B = ["lo", "eoo"],首先统计B中每个元素出现的次数,这里有两个元素,这里存储26个字母:
“lo”:[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
"eoo": [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
所以采用bmax存储B中每个字符的最大值:
bmax = [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
因为只要最大值元素满足了,那么其他的当然没问题
然后遍历A中各个元素,这里以“amazon”为例:
“amazon”: [2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
由于“amazon”的l对应处为0,而bmax对应处为1,所以不满足。
再以“google”为例:
“google”: [0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
可以看到“google”中的各元素均大于等于bmax,所以满足条件,加入到结果集中
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 S = Solution() print(S.wordSubsets(["amazon","apple","facebook","google","leetcode"], ["lo","eo"]))