49. Group Anagrams

//: 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: 因为Set 是不能有相同元素的,如果aba,则只保留了ab,
 这样ab,和aba 就认为是一样了,如果再加上一个长度匹配来做,也是不行的,
 因为aba,abb 也被认为一样了。
 如果用Set 概念,把每一个元素都转换成一个Set ,然后最后的从头开始
 比较,相等则丢入第一个,Set 第一个比较完,跳到下一个,继续比较,
 直到SetArray 到结尾。
 
 //第二套方案:
 首先我们这样玩,由于是26个小写字母,我们把每个元素转换为26个数组堆
     a b c ... z
     2 0 1 ... 0 
 遍历字母,排好序,重新生成新的字符串,最后只要字符串相等,就认为是同一组素,(这里是不是可以再引申一下,我只需要,比较两个元素比较上是否相等,就认为是同一元素)
 
 //第三套方案:
 我们再利用Set 的特性,先把里面每个元素都有序
 比如aba -> aab, 然后把String 数组转换为Set,
 这样就变成了最后一共存在多少个数组,
 然后遍历Set,如果对应的内容相等,则丢进对应的Array中
 -----------------------------
  原始 [String]
     |
  每个元素自排序[OrderedString]  O(n)
     |
  Set<String>       Set内部时间复杂度
     |
  [[String]]         O(n*m)
 
 貌似空间复杂度有点高.
 
 */

func groupAnagrams(_ strs: [String]) -> [[String]] {
    guard strs.count > 0 else {
        return [[]]
    }
    
    
    //Error1: 这种方法太耗时, 实际上不就是把一个字符串转换为数组排序么
//    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 的方法,来做,最后的算法复杂度在O(n*m),
    //实际上只需用一个字典(key, [String]), 如果之前已经包含了这个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
}


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容