[Swift]LeetCode916.单词子集 | Word Subsets

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/9857027.html 
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

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 a, including 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].

我们给出了两个数组AB单词。每个单词都是一串小写字母。

现在,假设每个字母都出现在,包括多重性,那么单词b就是单词的一个子集。例如,"wrr"是"warrior"的子集,但不是"world"的子集。

现在说一个字aA普遍的,若对所有bBb 是的一个子集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 “]

注意:

  1. 1 <= A.length, B.length <= 10000
  2. 1 <= A[i].length, B[i].length <= 10
  3. A[i]并且B[i]仅由小写字母组成。
  4. 在所有的话A[i]都是独一无二的:没有i != jA[i] == A[j]

1536ms
 1 class Solution {
 2     func wordSubsets(_ A: [String], _ B: [String]) -> [String] {
 3         var patterns = Dictionary(B[0].map { ($0, 1) }, uniquingKeysWith: +)
 4         for b in B {
 5             updatePatterns(&patterns, b)
 6         }
 7         var results = [String]()
 8         outer: for a in A {
 9             let dict = Dictionary(a.map { ($0, 1) }, uniquingKeysWith: +)
10             for key in patterns.keys {
11                 guard let value = dict[key] else {
12                     continue outer
13                 }
14                 if value < patterns[key]! {
15                     continue outer
16                 }
17             }
18             results.append(a)
19         }
20         return results
21     }
22     
23     fileprivate func updatePatterns(_ patterns: inout [Character : Int], _ library: String) {
24         var chars = Array(library)
25         let dict = Dictionary(chars.map { ($0, 1) }, uniquingKeysWith: +) 
26         for key in dict.keys {
27             if let pattern = patterns[key] {
28                 patterns[key] = max(pattern, dict[key]!)
29             } else {
30                 patterns[key] = dict[key]
31             }
32         }
33     }
34 }

1864ms

 1 class Solution {
 2     func wordSubsets(_ A: [String], _ B: [String]) -> [String] {
 3         var bmax:[Int] = [Int](repeating: 0,count: 26)
 4         for b in B
 5         {
 6             var bCount:[Int] = count(b)
 7             for i in 0..<26
 8             {
 9                 bmax[i] = max(bmax[i], bCount[i])
10             }
11         }
12         var ans:[String] = [String]()
13         //类似goto语句功能
14         search: 
15         for a in A
16         {
17             var aCount:[Int] = count(a)
18             for i in 0..<26
19             {
20                 if aCount[i] < bmax[i]
21                 {
22                      
23                     continue search
24                    
25                 }  
26             }
27              ans.append(a)
28         }
29         return ans
30     }
31     
32     func count(_ str:String) -> [Int]
33     {
34         var ans:[Int] = [Int](repeating: 0,count: 26)
35         for char in str.characters
36         {
37             //A:65 a:97
38             ans[char.toInt() - 97] += 1 
39         }
40         return ans
41     }
42 }
43 
44 //Character扩展方法  
45 extension Character  
46 {  
47     func toInt() -> Int  
48     {  
49         var num:Int = Int()
50         for scalar in String(self).unicodeScalars  
51         {  
52             num = Int(scalar.value)  
53         }  
54         return num  
55     }  
56 }

2056ms

 1 class Solution {
 2     func wordSubsets(_ A: [String], _ B: [String]) -> [String] {
 3         var hms: [Character:Int] = [:]
 4         for b in B {
 5             var locHm: [Character:Int] = [:]
 6             for symbol in b {
 7                 let temp = (locHm[symbol] ?? 0) + 1
 8                 locHm[symbol] = temp
 9                 hms[symbol] = max((hms[symbol] ?? 0), temp)
10             }
11         }
12         
13         var res: [Int] = []
14         var aHms: [[Character:Int]] = Array(repeating: [:], count: A.count)
15         for (index, a) in A.enumerated() {
16             for symbol in a {
17                 aHms[index][symbol] = (aHms[index][symbol] ?? 0) + 1
18              }
19         }
20         
21          for (index, hm) in aHms.enumerated() {
22              var ok = true
23             for k in hms.keys {
24                 if (hm[k] ?? 0) < hms[k]! {
25                     ok = false
26                     break
27                 }
28             }
29              if ok {
30                  res.append(index)
31              }
32          }
33         
34         return res.map({A[$0]})
35     }
36 }

2208ms

 1 class Solution {
 2     func wordSubsets(_ A: [String], _ B: [String]) -> [String] {
 3         let bDicts:[[Character:Int]] = B.map { wordDict($0) }
 4         var bWord: [Character:Int] = [:]
 5         for bDict in bDicts {
 6             for (ch, count) in bDict {
 7                 bWord[ch] = max((bWord[ch] ?? 0), count)
 8             }
 9         }
10         
11         var result: [String] = []
12         for aWord in A {
13             let aDict = wordDict(aWord)
14             if contains(aDict, bWord) {
15                 result.append(aWord)
16             }
17         }
18         return result
19     }
20     
21     func wordDict(_ str: String) -> [Character:Int] {
22         var result: [Character:Int] = [:]
23         for ch in str {
24             result[ch] = (result[ch] ?? 0) + 1
25         }
26         return result
27     }
28     
29     func contains(_ aDict:[Character:Int], _ bDict:[Character: Int]) -> Bool {
30         for (key, count) in bDict {
31             if aDict[key] == nil || aDict[key]! < count {
32                 return false
33             }
34         }
35         return true
36     }
37 }

2240ms

 1 class Solution {
 2     func wordSubsets(_ A: [String], _ B: [String]) -> [String] {
 3         let universe: [Character: Int] = B.reduce(into: [:]) { res, next in
 4             let c = countCharacters(in: next)
 5             for kv in c {
 6                 res[kv.key] = max(kv.value, res[kv.key] ?? 0)
 7             }
 8         }
 9         return A.filter { self.isWord($0, universalIn: universe) }
10     }
11     
12     func isWord(_ word: String, universalIn universe: [Character: Int]) -> Bool {
13         var wordCount = countCharacters(in: word)
14         for kv in universe {
15             guard let count = wordCount[kv.key], count >= kv.value else {
16                 return false
17             }
18         }
19         return true
20     }
21     
22     func countCharacters(in word: String) -> [Character: Int] {
23         return word.reduce(into: [:]) { (result, next) in
24             let count = result[next] ?? 0
25             result[next] = count + 1
26         }
27     }
28 }

2484ms

 1 class Solution {
 2     func wordSubsets(_ A: [String], _ B: [String]) -> [String] {
 3         let universe: [Character: Int] = B.reduce(into: [:]) { res, next in
 4             let c = countCharacters(in: next)
 5             for kv in c {
 6                 res[kv.key] = max(kv.value, res[kv.key] ?? 0)
 7             }
 8         }
 9         
10         return A.filter { (word) -> Bool in
11             return self.isWord(word, universalIn: universe)
12         }
13     }
14     
15     func isWord(_ word: String, universalIn universe: [Character: Int]) -> Bool {
16         var wordCount = countCharacters(in: word)
17         for kv in universe {
18             guard let count = wordCount[kv.key], count >= kv.value else {
19                 return false
20             }
21         }
22         return true
23     }
24     
25     func countCharacters(in word: String) -> [Character: Int] {
26         return word.reduce(into: [:]) { (result, next) in
27             let count = result[next] ?? 0
28             result[next] = count + 1
29         }
30     }
31 }

2652ms

 1 class Solution {
 2     func wordSubsets(_ A: [String], _ B: [String]) -> [String] {
 3 
 4         let bCounterArray = B
 5             .map {
 6                 $0.reduce(into: [:]) {
 7                     $0[String($1), default: 0] += 1
 8                 }
 9             }
10             .reduce(into: [:]) { (dict: inout [String: Int], word:  [String: Int]) in
11                 word.forEach {
12                     dict[$0] = (dict[$0] == nil ? $1 : max(dict[$0]!, $1))
13                 }
14         }
15 
16         let aCounterDictionary = A.reduce(into: [:]) {
17             $0[$1] = $1.reduce(into: [:]) {
18                 $0[String($1), default: 0] += 1
19             }
20         }
21 
22         var answer = [String]()
23 
24         for (word, aCounter) in aCounterDictionary {
25             var isUniversal = true
26             for (key, bval) in bCounterArray {
27                 guard let aval = aCounter[key], aval >= bval else {
28                     isUniversal = false
29                     break
30                 }
31             }
32 
33             if isUniversal {
34                 answer.append(word)
35             }
36         }
37 
38         return answer
39     }
40 }

2708ms

 1 class Solution {
 2     func wordSubsets(_ A: [String], _ B: [String]) -> [String] {
 3         var mb = [Character: Int]()
 4         for b1 in B {
 5             var d = [Character: Int]()
 6             for b2 in b1 {
 7                 d[b2, default: 0] += 1
 8             }
 9             for k in d.keys {
10                 mb[k, default: 0] = max(mb[k, default: 0], d[k]!)
11             }
12         }
13         //print(mb)
14         return A.filter { s in
15             var d = [Character: Int]()
16             for c in s {
17                 d[c, default: 0] += 1
18             }
19             //print(d)
20             for k in mb.keys {
21                 guard mb[k]! <= d[k, default: 0] else {
22                     return false
23                 }
24             }
25             return true
26         }
27     }
28 }

2712ms

 1 class Solution {
 2     func wordSubsets(_ A: [String], _ B: [String]) -> [String] {
 3         var result = [String]()
 4         var bMap = [Character : Int]()
 5         for bWord in B {
 6             var bMapTemp = [Character : Int]()
 7             for character in bWord {
 8                 if let value = bMapTemp[character] {
 9                     bMapTemp[character] = value + 1
10                 } else {
11                     bMapTemp[character] = 1
12                 }
13                 
14                 if let value1 = bMap[character], let value2 = bMapTemp[character]  {
15                     bMap[character] = max(value1, value2)
16                 } else {
17                     bMap[character] = bMapTemp[character]
18                 }
19     
20             }
21             
22         }
23         //print(bMap)
24         for aWord in A {
25             var aMap = [Character : Int]()
26             for character in aWord {
27                 if let value = aMap[character] {
28                     aMap[character] = value + 1
29                 } else {
30                     aMap[character] = 1
31                 }
32             }
33             
34             var shouldAdd = true
35             for (key, value) in bMap {
36                 //print("key \(key), value \(value), aMap \(aMap)")
37                 guard let aValue = aMap[key] else {
38                     shouldAdd = false
39                     break
40                 }
41                 if aValue < value {
42                     shouldAdd = false
43                     break
44                 }
45             }
46             if shouldAdd {
47                 result.append(aWord)
48             }
49         }
50         
51         return result
52     }
53 }

3208ms

 1 class Solution {
 2     
 3     // B = ["o", "oo", "oo", "ooo"]
 4     
 5     func wordSubsets(_ A: [String], _ B: [String]) -> [String] {
 6         let reducedSet: [Character: Int] = B.reduce(into: [:]) { res, next in
 7             for (k, v) in countCharacters(in: next) {
 8                 res[k] = max(v, res[k] ?? 0)
 9             }
10         }
11         return A.filter { self.isWord($0, universalFor: reducedSet) }
12     }
13     
14     func isWord(_ word: String, universalFor characters: [Character: Int]) -> Bool {
15         let characterCount = countCharacters(in: word)
16         return !characters.contains {
17             let count = characterCount[$0.key]
18             return count == nil || count! < $0.value
19         }
20     }
21     
22     func countCharacters(in word: String) -> [Character: Int] {
23         return word.reduce(into: [:]) { (result, next) in
24             let count = result[next] ?? 0
25             result[next] = count + 1
26         }
27     }
28 }

3600ms

 1 class Solution {
 2     
 3     // B = ["o", "oo", "oo", "ooo"]
 4     
 5     func wordSubsets(_ A: [String], _ B: [String]) -> [String] {
 6         let reducedSet: [Character: Int] = B.reduce(into: [:]) { res, next in
 7             for (k, v) in countCharacters(in: next) {
 8                 res[k] = max(v, res[k] ?? 0)
 9             }
10         }
11         return A.filter { self.isWord($0, universalFor: reducedSet) }
12     }
13     
14     func isWord(_ word: String, universalFor characters: [Character: Int]) -> Bool {
15         let characterCount = countCharacters(in: word)
16         return !characters.contains {
17             let count = characterCount[$0.key]
18             return count == nil || count! < $0.value
19         }
20     }
21     
22     func countCharacters(in word: String) -> [Character: Int] {
23         return word.reduce(into: [:]) { (result, next) in
24             let count = result[next] ?? 0
25             result[next] = count + 1
26         }
27     }
28 }

 

转载于:https://www.cnblogs.com/strengthen/p/9857027.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/450902.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

揭秘腾讯研究院输出策略:产品和人才的孵化器

直到现在&#xff0c;腾讯研究院创始人郑全战仍坚持面试招入研究院的每一个人&#xff0c;并做详细记录。天赋上的灵性、性格中的包容是他看重的&#xff0c;当然首先人要踏实。大约6年前&#xff0c;郑全战加入腾讯&#xff0c;负责筹建中国互联网公司中的第一个研究院&#x…

java后端必会【基础知识点】

&#xff08;一&#xff09;java集合类&#xff08;done&#xff09; 在java集合类中最常用的是Collection和Map的接口实现类。Collection又分为List和Set两类接口&#xff0c;List的实现类有ArrayList、LinkedList、Vector、Stack&#xff0c;Set接口的实现类有HashSet、Tree…

无法连接虚拟设备ide1:0,主机上没有相对应的设备... 解决

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 运行虚拟机出现报错&#xff1a; 无法连接虚拟设备ide1:0&#xff0c;主机上没有相对应的设备&#xff0c;您 要在每次开启此虚拟机时都…

缴满15年能领多少钱 养老金计算公式网上疯传

社保人员称我省计算方式与各设区市平均工资挂钩&#xff0c;与网上不同 最近&#xff0c;关于“延迟退休”引起各方高度关注&#xff0c;成为广大居民十分关心的话题。是否延迟退休尚无定论&#xff0c;但在网上有不少关于养老金的计算。那网上流传的计算方法是否科学&#xff…

48_并发编程-线程-资源共享/锁

一、数据共享多个线程内部有自己的数据栈&#xff0c;数据不共享&#xff1b;全局变量在多个线程之间是共享的。1 # 线程数据共享不安全加锁2 3 import time4 from threading import Thread, Lock5 6 7 num 1008 9 def func(t_lock): 10 global num 11 t_lock.acquire…

移动硬盘提示无法访问设备硬件出现致命错误,导致请求失败的资料寻回方案

J盘打不开设备硬件出现致命错误,导致请求失败&#xff0c;是因为这个I盘的文件系统内部结构损坏导致的。要恢复里面的数据就必须要注意&#xff0c;这个盘不能格式化&#xff0c;否则数据会进一步损坏。具体的恢复方法看正文 工具/软件&#xff1a;星空数据恢复软件 步骤1&…

VMware10上新建虚拟机步骤图解

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 第一种 : 自定义方式&#xff1a; 安装虚拟机的过程步骤&#xff0c;基本上过程的每一步都有截图&#xff0c;跟着过程就可以很容易的创…

怎么理解 IaaS、SaaS 和 PaaS 的区别?

原文链接&#xff1a;怎么理解 IaaS、SaaS 和 PaaS 的区别&#xff1f; 一、定义层面的区别 SaaS、PaaS、IaaS简单的说都属于云计算服务&#xff0c;也就是云计算服务。我们对于云计算的概念&#xff0c;维基百科有以下定义&#xff1a; Cloud computing is a new form of In…

三星“打法”:先模仿对手 再吃掉对手

台湾地区电子业者将三星视为“台湾公敌”&#xff0c;事实上&#xff0c;它几乎是全球电子业者的敌人。 这家韩国电子业巨头十年之间夺取了日本企业在这一领域中纵横30年的荣光&#xff0c;更是建立起了令人叹为观止的垂直整合帝国。 韩国政府的大力支持、日元升值韩元贬值等均…

SharpZipLib 压缩ZIP导出

1      var uploadSectionDir Path.Combine("Upload", "QQ", DateTime.Now.ToString("yyyyMMdd"));2 string uploadDir Path.Combine(HttpRuntime.AppDomainAppPath, uploadSectionDir);3 if (!Directory.Exi…

java动态调用c++库

前言 最近在做一个通过java程序调用c动态语言库&#xff0c;在网上百度&#xff0c;谷歌找了诸多例子&#xff0c;还是屡试不爽。经过一番折腾还是披荆斩棘&#xff0c;创出一条道路。希望分享给正在迷茫的朋友们... 使用的环境 spring boot gradle JNI介绍 JNI全拼是Java Nat…

如何删除虚拟机上的操作系统、删除新建的虚拟机

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 打开VMware&#xff0c;我安装了三个虚拟系统&#xff0c;要对win98进行删除&#xff0c;从磁盘上删除~~ 2、双击你要删除的系统&#xf…

什么是QoS技术

QoS&#xff08;Quality of Service&#xff09;是服务质量的简称。从传统意义上来讲&#xff0c;无非就是传输的带宽、传送的时延、数据的丢包率等&#xff0c;而提高服务质量无非也就是保证传输的带宽&#xff0c;降低传送的时延&#xff0c;降低数据的丢包率以及时延抖动等。…

一套完整的用户增长系统架构

互联网的世界里一切都是为了增长&#xff0c;灵光一现的创新可能会让一个产品成功&#xff0c;但绝不可能长久。 在用户增长的领域里&#xff0c;如何复用一套框架&#xff0c;找到最佳实践的一条路径&#xff0c;再配备一点运气&#xff0c;去实现商业成功是我一直所探索的话题…

编译性语言、解释性语言和脚本语言

什么是编译性语言、解释性语言和脚本语言 计算机不能直接理解高级语言&#xff0c;只能直接理解机器语言&#xff0c;所以必须要把高级语言翻译成机器语言&#xff0c;计算机才能值型高级语言编写的程序。  翻译的方式有两种&#xff0c;一个是编译&#xff0c;一个是解释。…

对多租户的理解

一、 多租户定义 多租户定义&#xff1a; 多租户技术或称多重租赁技术&#xff0c;简称SaaS&#xff0c;是一种软件架构技术&#xff0c;是实现如何在多用户环境下&#xff08;此处的多用户一般是面向企业用户&#xff09;共用相同的系统或程序组件&#xff0c;并且可确保各用…

查看VMware上虚拟机的 ip 地址

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 开启虚拟机&#xff1a; 2.输入账号密码登陆到虚拟机中 3. 选择 xxx Home 右键---- Open in Terinal 进入命令行页面 ----- 输入命令…

Hibernate之表间关系

ManyToOne 多对一&#xff0c;是最常见的表间关系&#xff0c;对应关系数据库中的外键关系。通常用于建立子实体和其父实体的关联关系 Entity(name "Person") public static class Person {IdGeneratedValueprivate Long id;//Getters and setters are omitted for …

Python大神告诉你,学习Python应该读哪些书!

关注头条号&#xff0c;私信回复资料会有意外惊喜呦………………最后一张照片有资料呦。在传统的Web开发之外的领域&#xff0c;Python开发人员的就业机会越来越多&#xff0c;无论你是初学者还是大神&#xff0c;现在正是投入到Python学习的好时机。一个IBM的博客文章报道了如…

脚本语言

脚本语言&#xff08;Script language&#xff0c;scripting language&#xff0c;scripting programming language&#xff09;是为了缩短传统的编写-编译-链接-运行&#xff08;edit-compile-link-run&#xff09;过程而创建的计算机编程语言。此命名起源于一个脚本“screenp…