0916. 单词子集
大约 2 分钟
---
0916. 单词子集
- 标签:数组、哈希表、字符串
- 难度:中等
题目链接
题目大意
描述:
给定两个字符串数组 和 。
现在,如果 中的每个字母都出现在 中,包括重复出现的字母,那么称字符串 是字符串 的「子集」。
- 例如,
"wrr"是"warrior"的子集,但不是"world"的子集。
如果对 中的每一个单词 , 都是 的子集,那么我们称 中的单词 是「通用单词」。
要求:
以数组形式返回 中所有的「通用」单词。你可以按任意顺序返回答案。
说明:
- 。
- 。
- 和 仅由小写英文字母组成。
- 中的所有字符串「互不相同」。
示例:
- 示例 1:
输入:words1 = ["amazon","apple","facebook","google","leetcode"], words2 = ["e","o"]
输出:["facebook","google","leetcode"]- 示例 2:
输入:words1 = ["amazon","apple","facebook","google","leetcode"], words2 = ["lc","eo"]
输出:["leetcode"]解题思路
思路 1:哈希表
对于 中的每个单词,检查它是否包含 中所有单词的字母(包括重复)。
- 首先统计 中每个字母的最大需求量(对所有单词取并集)。
- 对于 中的每个单词,统计其字母频率。
- 检查该单词是否满足 的所有字母需求。
- 如果满足,将该单词加入结果列表。
思路 1:代码
class Solution:
def wordSubsets(self, words1: List[str], words2: List[str]) -> List[str]:
# 统计 words2 中每个字母的最大需求量
max_freq = collections.Counter()
for word in words2:
freq = collections.Counter(word)
for char, count in freq.items():
max_freq[char] = max(max_freq[char], count)
result = []
# 检查 words1 中的每个单词
for word in words1:
freq = collections.Counter(word)
# 检查是否满足所有字母需求
is_universal = True
for char, count in max_freq.items():
if freq[char] < count:
is_universal = False
break
if is_universal:
result.append(word)
return result思路 1:复杂度分析
- 时间复杂度:,其中 和 分别是 和 的长度, 和 是单词的平均长度。
- 空间复杂度:,字母表大小固定为 。