LeetCode:49. Group Anagrams
阿新 • • 發佈:2019-01-28
問題描述:
給定一個字串陣列,將字母異位詞組合在一起。字母異位詞指字母相同,但排列不同的字串。
示例:
輸入: [“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))
歡迎指正哦。