LeetCode - 49. 字母異位詞分組

給定一個(gè)字符串?dāng)?shù)組舔痪,將字母異位詞組合在一起静盅。字母異位詞指字母相同究流,但排列不同的字符串。

示例:

輸入: ["eat", "tea", "tan", "ate", "nat", "bat"]
輸出:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
說明:

所有輸入均為小寫字母榆纽。
不考慮答案輸出的順序仰猖。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/group-anagrams
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系官方授權(quán)奈籽,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處饥侵。

算法

swift

/**
 利用一個(gè)字典維護(hù)異位詞數(shù)組
 key:排序之后的異位詞,是異位詞衣屏,排序之后相同躏升,添加到這個(gè)key中的value中
 value:異位詞數(shù)組
 時(shí)間復(fù)雜度為O(nklogk) n:字符串?dāng)?shù)組長(zhǎng)度,k:字符串?dāng)?shù)組中字符串的最大長(zhǎng)度
 空間復(fù)雜度為O(nk)
 */
func groupAnagrams(_ strs: [String]) -> [[String]] {
    if strs.count == 0 {
        return []
    }
    if strs.count == 1 {
        return [strs]
    }
    // key: strs中的字符串排序之后的數(shù)據(jù)(是異位詞狼忱,排序之后的字符串相同)膨疏,value:異位詞數(shù)組
    var map: [String: [String]] = [:]
    for str in strs {
        // 字符串排序
        let char = String(str.sorted())
        // map中沒有這個(gè)key
        if !map.keys.contains(char) {
            map[char] = [String]()
        }
        map[char]!.append(str)
    }
    return Array(map.values)
}

??官方圖解
/**
 當(dāng)且僅當(dāng)它們的字符計(jì)數(shù)(每個(gè)字符的出現(xiàn)次數(shù))相同時(shí),兩個(gè)字符串是字母異位詞钻弄。
 
 與上面解法有差異的一點(diǎn)是佃却,判斷異位詞的key是以字母出現(xiàn)的次數(shù)
 時(shí)間復(fù)雜度為O(nk) n:字符串?dāng)?shù)組長(zhǎng)度,k:字符串?dāng)?shù)組中字符串的最大長(zhǎng)度
 空間復(fù)雜度為O(nk)
 */
func groupAnagrams(_ strs: [String]) -> [[String]] {
    if strs.count == 0 {
        return []
    }
    if strs.count == 1 {
        return [strs]
    }
    // key: 字符串中每個(gè)字母出現(xiàn)的次數(shù)組成的字符串窘俺,value:異位詞數(shù)組
    var map: [String: [String]] = [:]
    for str in strs {
        // 字母出現(xiàn)的次數(shù)數(shù)組双霍,按字母ASCII索引-'a' 保存對(duì)應(yīng)字母出現(xiàn)次數(shù)
        var alphabet = [Int](repeating: 0, count: 26)
        let aScalarValue = "a".unicodeScalars.first!.value
        for scalar in str.unicodeScalars {
            alphabet[Int(scalar.value - aScalarValue)] += 1
        }
        // map中沒有這個(gè)key
        let key = alphabet.description
        if !map.keys.contains(key) {
            map[key] = [String]()
        }
        map[key]!.append(str)
    }
    return Array(map.values)
}

??官方圖解

GitHub:https://github.com/huxq-coder/LeetCode
歡迎star

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市批销,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌染坯,老刑警劉巖均芽,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異单鹿,居然都是意外死亡掀宋,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門仲锄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來劲妙,“玉大人,你說我怎么就攤上這事儒喊×头埽” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵怀愧,是天一觀的道長(zhǎng)侨颈。 經(jīng)常有香客問我余赢,道長(zhǎng),這世上最難降的妖魔是什么哈垢? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任妻柒,我火速辦了婚禮,結(jié)果婚禮上耘分,老公的妹妹穿的比我還像新娘举塔。我一直安慰自己,他們只是感情好求泰,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布央渣。 她就那樣靜靜地躺著,像睡著了一般拜秧。 火紅的嫁衣襯著肌膚如雪痹屹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天枉氮,我揣著相機(jī)與錄音志衍,去河邊找鬼。 笑死聊替,一個(gè)胖子當(dāng)著我的面吹牛楼肪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播惹悄,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼春叫,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了泣港?” 一聲冷哼從身側(cè)響起暂殖,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎当纱,沒想到半個(gè)月后呛每,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡坡氯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年晨横,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片箫柳。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡手形,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出悯恍,到底是詐尸還是另有隱情库糠,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布坪稽,位于F島的核電站曼玩,受9級(jí)特大地震影響鳞骤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜黍判,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一豫尽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧顷帖,春花似錦美旧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至陶舞,卻和暖如春嗽测,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背肿孵。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工唠粥, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人停做。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓晤愧,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蛉腌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子官份,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345