//: Playground - noun: a place where people can play
import UIKit
/*
49. Group Anagrams
Given an array of strings, group anagrams together.
For example, given: ["eat", "tea", "tan", "ate", "nat", "bat"],
Return:
[
["ate", "eat","tea"],
["nat","tan"],
["bat"]
]
*/
/*
Thinking:
//Error: 因?yàn)镾et 是不能有相同元素的,如果aba,則只保留了ab,
這樣ab,和aba 就認(rèn)為是一樣了,如果再加上一個(gè)長(zhǎng)度匹配來做,也是不行的,
因?yàn)閍ba,abb 也被認(rèn)為一樣了。
如果用Set 概念,把每一個(gè)元素都轉(zhuǎn)換成一個(gè)Set ,然后最后的從頭開始
比較,相等則丟入第一個(gè),Set 第一個(gè)比較完,跳到下一個(gè),繼續(xù)比較,
直到SetArray 到結(jié)尾。
//第二套方案:
首先我們這樣玩,由于是26個(gè)小寫字母,我們把每個(gè)元素轉(zhuǎn)換為26個(gè)數(shù)組堆
a b c ... z
2 0 1 ... 0
遍歷字母,排好序,重新生成新的字符串,最后只要字符串相等,就認(rèn)為是同一組素,(這里是不是可以再引申一下,我只需要,比較兩個(gè)元素比較上是否相等,就認(rèn)為是同一元素)
//第三套方案:
我們?cè)倮肧et 的特性,先把里面每個(gè)元素都有序
比如aba -> aab, 然后把String 數(shù)組轉(zhuǎn)換為Set,
這樣就變成了最后一共存在多少個(gè)數(shù)組,
然后遍歷Set,如果對(duì)應(yīng)的內(nèi)容相等,則丟進(jìn)對(duì)應(yīng)的Array中
-----------------------------
原始 [String]
|
每個(gè)元素自排序[OrderedString] O(n)
|
Set<String> Set內(nèi)部時(shí)間復(fù)雜度
|
[[String]] O(n*m)
貌似空間復(fù)雜度有點(diǎn)高.
*/
func groupAnagrams(_ strs: [String]) -> [[String]] {
guard strs.count > 0 else {
return [[]]
}
//Error1: 這種方法太耗時(shí), 實(shí)際上不就是把一個(gè)字符串轉(zhuǎn)換為數(shù)組排序么
// let aValue = ("a" as UnicodeScalar).value // 65
// func orderString(_ str: String) -> String {
// var charArray:[Int8] = Array<Int8>(repeating: 0, count: 26)
// var maxDistance = 0
// var minDistance = -1
// for charValue in str.unicodeScalars {
// let distance = Int(charValue.value - aValue)
// charArray[distance] += 1
// if (minDistance == -1) {
// minDistance = distance
// }
// minDistance = distance < maxDistance ? distance : minDistance
// maxDistance = distance > maxDistance ? distance : maxDistance
// }
//
// let range = Range(maxDistance+1..<26)
// charArray.removeSubrange(range)
// if minDistance > 0 {
// let range = Range(0..<minDistance)
// charArray.removeSubrange(range)
// }
// let strArray = charArray.map{String($0)}
// return strArray.joined()
// }
//
// let orderedStrs = strs.map{orderString($0)}
let orderedStrs = strs.map{String($0.characters.sorted())}
print(orderedStrs)
//Error2: 如果用set 的方法,來做,最后的算法復(fù)雜度在O(n*m),
//實(shí)際上只需用一個(gè)字典(key, [String]), 如果之前已經(jīng)包含了這個(gè)key,就合并,沒有包含,就新增,最后把Value提升到二維返回即可
// let setStrs = Set(orderedStrs)
// var retArray: [[String]] = [[String]](repeatElement([], count: setStrs.count))
// for (index, value) in setStrs.enumerated() {
// for (i, v) in orderedStrs.enumerated() {
// if (value == v) {
// retArray[index].append(strs[i])
// }
// }
// }
var dict:[String: [String]] = [String: [String]]()
for (i, v) in orderedStrs.enumerated() {
if let _ = dict[v] {
dict[v]!.append(strs[i])
}
else {
dict[v] = [String]()
dict[v]!.append(strs[i])
}
}
let retArray: [[String]] = dict.values.map{Array<String>($0)}
return retArray
}
49. Group Anagrams
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
推薦閱讀更多精彩內(nèi)容
- Given an array of strings, group anagrams together. Note:...
- Given an array of strings, group anagrams together.For ex...
- Given an array of strings, group anagrams together. For e...
- Medium 好幾個(gè)String, HashMap的API不是很熟悉,但非常實(shí)用,記一下吧: char[] 和 S...