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
相关推荐
du fei15 分钟前
C# 窗体应用(.FET Framework) 线程操作方法
开发语言·c#
du fei17 分钟前
C#文件操作
开发语言·c#
亓才孓29 分钟前
[leetcode]树的操作
算法·leetcode·职场和发展
Ljugg1 小时前
把doi直接插入word中,然后直接生成参考文献
开发语言·c#·word
loser~曹1 小时前
基于快速排序解决 leetcode hot215 查找数组中第k大的数字
数据结构·算法·leetcode
Dream it possible!1 小时前
LeetCode 热题 100_打家劫舍(83_198_中等_C++)(动态规划)
c++·算法·leetcode·动态规划
SylviaW082 小时前
python-leetcode 62.搜索插入位置
数据结构·算法·leetcode
厦门德仔2 小时前
【C#】C#字符串拼接的6种方式及其性能分析对比
服务器·windows·c#
画个逗号给明天"3 小时前
C#从入门到精通(5)
开发语言·笔记·c#
Joe_Wang54 小时前
[图论]拓扑排序
数据结构·c++·算法·leetcode·图论·拓扑排序