1. 程式人生 > >LeetCode:49. Group Anagrams

LeetCode:49. Group Anagrams

問題描述:


給定一個字串陣列,將字母異位詞組合在一起。字母異位詞指字母相同,但排列不同的字串。
示例:

輸入: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”],
輸出: [ [“ate”,”eat”,”tea”], [“nat”,”tan”], [“bat”] ]

說明:

  • 所有輸入均為小寫字母
  • 不考慮答案輸出的順序

問題分析:

方法1:

首先把字串排序,如果排序的字串相同,就放到到一起,可以用Python中的字典實現。
Python3實現:

# @Time   :2018/7/16
# @Author :LiuYinxing
class Solution: def groupAnagrams(self, strs): res = {} for item in strs: k = ''.join(sorted(item)) # 字串排序 if k not in res: # 判斷是否存在 res[k] = [] res[k].append(item) # 相同字串放到同一個字典 k中 return [res[x] for x in res] # 輸出結果
if __name__ == '__main__': strs = ['eat', 'tea', 'tan', 'ate', 'nat', 'bat'] solu = Solution() print(solu.groupAnagrams(strs))
方法2:

上面提到的排序,那麼一般排序的時間複雜度,比較好的是N(nlogn),因為題目已經說明,輸入的字串全為小寫字元,現在可以桶排序的思想,就是讓字串對號入座,如果相同的位置就加1,這樣排序過程時間複雜度N(n),算是一點改進了,根據提交結果來看,並沒有快多少,尷尬。

# @Time   :2018/7/16
# @Author :LiuYinxing class Solution: def groupAnagrams(self, strs): res = {} for s in strs: count = [0] * 26 # 定義桶長 for c in s: # 類似於桶排序的,找號入座,如果已經存在就加一 count[ord(c) - ord('a')] += 1 if tuple(count) not in res: res[tuple(count)] = [] res[tuple(count)].append(s) # 新增到字典 return list(res.values()) # 返回結果 if __name__ == '__main__': strs = ['eat', 'tea', 'tan', 'ate', 'nat', 'bat'] solu = Solution() print(solu.groupAnagrams(strs))

歡迎指正哦。