↓快轉到主要內容
  1. LeetCode/

LeetCode 49: Group Anagrams

·1 分鐘· ·
LeetCode Medium Array Hash-Table String Sorting
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: medium 第一次嘗試:2022-10-22

  • 提交紀錄:Runtime Error → Wrong Answer ×2 → Time Limit Exceeded ×3 → Accepted → Runtime Error → Accepted ×3

解題思路
#

互為 anagram 的字串排序之後一模一樣,所以用 "".join(sorted(s))(或 tuple(sorted(s)))當 key(Hash Table 模板五),丟進 defaultdict(list),最後回傳所有的 value。也可以用長度 26 的次數 tuple 當 key,省掉排序。

我的嘗試
#

這題提交了 11 次:

  • 第一版變數打錯(rse,NameError);第二版只在既有的組別裡找,找不到時沒有新增一組,所以永遠回傳空的。
  • 第三版補上新增,但用 set 判斷是不是同一組:["bb", "b"] 被分在同一組。
  • 改成用 Counter 比較之後答案對了,但每個字串都要跟每一組比,TLE 了三次。
  • 最後改成「排序後當 key」才 AC。2022-10-27 重寫時把 values() 寫成 values 又 RE 一次。

正確解法
#

class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        groups = defaultdict(list)
        for s in strs:
            groups["".join(sorted(s))].append(s)
        return list(groups.values())

複雜度
#

時間 O(n · k log k)(k 是字串長度),空間 O(nk)。

要特別避免的錯誤
#

  • 不能用 set 比:"bb" 和 "b" 的字元集合相同,但不是 anagram。
  • 每個字串都跟現有的每一組比是 O(n²),會 TLE;用 key 一次就能找到組別。
  • dict.values 是方法,要加括號。

面試口說整理
#

我把每個字串排序後當成雜湊表的 key,互為 anagram 的字串會得到同一個 key,最後回傳所有組別。時間 O(n · k log k);如果字串很長,可以改用 26 個字母的次數當 key。

相關文章

LeetCode 47: Permutations II
·1 分鐘
LeetCode Medium Array Backtracking Sorting
LeetCode 47 解題筆記:先排序,同一層如果跟前一個值相同而且前一個還沒被用,就跳過
LeetCode 56: Merge Intervals
·1 分鐘
LeetCode Medium Array Sorting Quicksort
LeetCode 56 解題筆記:按起點排序,新區間的起點 <= 結果最後一個的終點就合併(終點取 max),否則另開一個
LeetCode 36: Valid Sudoku
·1 分鐘
LeetCode Medium Array Hash-Table Matrix
LeetCode 36 解題筆記:每個數字在列、欄、3 × 3 宮格各只能出現一次;用 (數字, 列)、(數字, 欄)、(數字, 宮格) 當 key 放進同一個集合
LeetCode 15: 3Sum
·2 分鐘
LeetCode Medium Array Two-Pointers Sorting
LeetCode 15 解題筆記:排序後固定第一個數,剩下用對撞指針找兩數和;三個位置都要跳過相同的值,才不會有重複的組合
LeetCode 16: 3Sum Closest
·1 分鐘
LeetCode Medium Array Two-Pointers Sorting
LeetCode 16 解題筆記:排序後固定一個數,對撞指針找另外兩個;比較的是和跟 target 的距離 abs(sum - target)
LeetCode 17: Letter Combinations of a Phone Number
·1 分鐘
LeetCode Medium Hash-Table String Backtracking
LeetCode 17 解題筆記:每一層處理一個數字,枚舉它對應的字母;空字串要回傳空 list