[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?B,?b?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.pswp.cn/news/450902.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450902.shtml
英文地址,請注明出處:http://en.pswp.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…