讓我們一起啃演算法----字母異位詞分組

三斤和他的喵發表於2020-05-06

字母異位詞分組( Group-Anagrams )

題幹:

給定一個字串陣列,將字母異位片語合在一起。字母異位詞指字母相同,但排列不同的字串。
示例:
  輸入: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]
  輸出:
  [
    [“ate”,”eat”,”tea”],
    [“nat”,”tan”],
    [“bat”]
  ]
說明:
  所有輸入均為小寫字母。
  不考慮答案輸出的順序。

解題思路

在現實生活中如果我們要對某些事物進行分組,首先會制定一個標準。例如以前讀書的時候,一門課掌握地好壞的標準往往是考試成績,成績在85分以上為優秀,70以上為中等偏上,60分以上為中等,小於60分為不及格。同理,針對本題我們首先需要制定一個分組標準,標準不同,解題思路也不同。

這裡提供一個常見的標準:由於字母異位詞指字母相同,排列順序不同的字串。因此我們可以對每一個字串的字母進行升序(降序),如果升序之後的字串相等,那麼它們就是一組的。

流程圖如下:

其他標準:
   1.題目指明字串由小寫字母組成,因此可以初始化一個長度為 26 的陣列對應一個字串,記錄字串每一個字母出現的次數。如果兩個陣列相同,則表示對應的字串為一組。( 注意空間複雜度 )
    2.將 26 個字母與質數相關聯,一個字串由其字母對應質數的乘積表示,如果兩個字串的乘積相同,那麼對應字串為一組。( 可能會溢位 )

程式碼實現

GO語言實現

func groupAnagrams(strs []string) [][]string {
    var res [][]string
    // 對映關係
    hashMap := make(map[string][]string)
    for _, v := range strs {
        // 轉成字元陣列
        charArr := []byte(v)
        // 按從小到大排序字元陣列
        sort.SliceStable(charArr, func(i, j int) bool {
            return charArr[i] < charArr[j]
        })
        // 將升序排列的字元陣列轉成字串,作為 map 的鍵
        // map 的值為分組之後的字串,用一個陣列儲存( go 切片)
        hashMap[string(charArr)] = append(hashMap[string(charArr)], v)
    }

    // 根據 map 的值生成一個二維陣列(go 二維切片)
    for _, v := range hashMap {
        res = append(res, v)
    }
    return res
}

總結

每天進步一點點,加油!
演算法教程專案,每天更新一題,點個 star 支援一下呀
https://github.com/wx-satellite/learning-a…

本作品採用《CC 協議》,轉載必須註明作者和本文連結

三斤

相關文章