字母異位詞分組( 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 協議》,轉載必須註明作者和本文連結