【leetcode 49】【字母異位詞分組】

zyuPp發表於2020-10-19

leetcode49 字母異位詞分組

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

示例:

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


解題思路與程式碼思路:

在寫程式碼的時候,發現難點在於對雜湊表和python字典的運用,以及列表中的列表的拆解。寫程式碼或思考時,最好在紙張上畫一下

排序法

排序是對列表中的每個字串做排序,異位詞排完序後是相等的,可以把這個值作為key值放入字典,然後把共同的異位詞都放在一個列表中作為value。在程式碼實現時,有兩個重點:

  1. sorted(‘str’)得到的結果是列表,因為key值必須是不可變型別,所以要把列表轉化為tuple
  2. 我們該如何把value存放為列表呢? ans = collections.defaultdict(list) ,這是一種方法,可以把value值看作list,不過需要導包。例外一種方法就是dict[key] = dict.get(key, []) + [item] ,get方法是獲取key對應的值,若不存在就返回default=[],我們這裡設定為列表,然後把需要新增的元素以列表形式相加即可。

最後也別忘了返回的dict.values需要轉回list

計數法

其實這個方法與上一個的形式很相似,只是把key值用計數的方式儲存。利用只有26個小寫字母的特點,可以使用ascii碼作為key,字母的計數作為value。使用與上面同樣的方式返回正確答案


程式碼:

排序法
class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        dict = {}
        for item in strs:
            key = tuple(sorted(item))
            dict[key] = dict.get(key, []) + [item]
        return list(dict.values())
計數法
class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        res = {}
        for i in strs:
            new_str = [0]*26
            for j in i:
                new_str[ord(j)-ord('a')] +=1 
            key = tuple(new_str)
            res[key] = res.get(key,[])+[i]
        return list(res.values())


復 雜 度 分 析 : \color{red}{複雜度分析:}
  1. 排序法
  • 時間複雜度: O(NKlogK),N是列表長度,K是strs中字串長度最大的值
  • 空間複雜度:O(NK),排序儲存在字典的空間,有N次,每次最大儲存為K
  1. 計數法:
  • 時間複雜度:O(NK)
  • 空間複雜度:O(NK)

相關文章