leetcode - 916. Word Subsets

Description

You are given two string arrays words1 and words2.

A string b is a subset of string a if every letter in b occurs in a including multiplicity.

For example, "wrr" is a subset of "warrior" but is not a subset of "world".

A string a from words1 is universal if for every string b in words2, b is a subset of a.

Return an array of all the universal strings in words1. You may return the answer in any order.

Example 1:

Input: words1 = ["amazon","apple","facebook","google","leetcode"], words2 = ["e","o"]
Output: ["facebook","google","leetcode"]

Example 2:

Input: words1 = ["amazon","apple","facebook","google","leetcode"], words2 = ["l","e"]
Output: ["apple","google","leetcode"]

Constraints:

1 <= words1.length, words2.length <= 10^4
1 <= words1[i].length, words2[i].length <= 10
words1[i] and words2[i] consist only of lowercase English letters.
All the strings of words1 are unique.

Solution

A little bit tricky and one take-away is: if the total time complexity is around 1 0 8 10^8 108, don't try it, it will be TLE.

The core idea is, we build a hashmap of words2, and iterate all the strings in words1 to decide if we want to select it. The tricky part is how we build the hash map.

Because oo won't be a subset of aeiou, but ['ao', 'eo'] would be a subset of aeiou, so to build the hash map, we just need to store the maximum frequency of the string in words2.

Time complexity: o ( w o r d s 2. l e n + w o r d s 1. l e n ) o(words2.len + words1.len) o(words2.len+words1.len)

Space complexity: o ( 1 ) o(1) o(1)

Code

python3 复制代码
class Solution:
    def wordSubsets(self, words1: List[str], words2: List[str]) -> List[str]:
        words2_fre = [0] * 26
        for each_word in words2:
            ch_cnt = collections.Counter(each_word)
            for each_ch, each_cnt in ch_cnt.items():
                ch_index = ord(each_ch) - ord('a')
                words2_fre[ch_index] = max(words2_fre[ch_index], each_cnt)
        res = []
        for each_word in words1:
            ch_cnt = collections.Counter(each_word)
            is_candidate = True
            for i in range(26):
                if ch_cnt.get(chr(i + ord('a')), 0) < words2_fre[i]:
                    is_candidate = False
                    break
            if is_candidate:
                res.append(each_word)
        return res
相关推荐
苏克贝塔几秒前
c#版本、.net版本、visual studio版本之间的对应关系
c#·.net·visual studio
MrZhangBaby3 小时前
SQL-leetcode-262. 行程和用户
linux·sql·leetcode
冠位观测者3 小时前
【Leetcode 热题 100】394. 字符串解码
数据结构·算法·leetcode
码农君莫笑5 小时前
WPF中组件之间传递参数的方法研究
microsoft·c#·wpf
Navigator_Z6 小时前
LeetCode //C - 541. Reverse String II
c语言·算法·leetcode
sjsjs117 小时前
【数据结构-堆】【哈希+最小堆】力扣1942. 最小未被占据椅子的编号
数据结构·leetcode·哈希算法
sysu637 小时前
74.搜索二维矩阵 python
开发语言·数据结构·python·线性代数·算法·leetcode·矩阵
友恒9 小时前
WPF基础(1.1):ComboBox的使用
c#·wpf
swimxu9 小时前
[ LeetCode 75 ] 283 移动零(JavaScript)
javascript·算法·leetcode