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

LeetCode 953: Verifying an Alien Dictionary

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

基本資料
#

難易度: easy 第一次嘗試:2022-09-26

  • 提交紀錄:Wrong Answer → Runtime Error ×4 → Wrong Answer → Runtime Error ×3 → Accepted ×3

解題思路
#

先建 rank[c] = 字母在 order 裡的位置(Hash Table)。字典序只要檢查相鄰兩個單字:從頭找第一個不同的字元,比 rank 決定大小;如果短的那個整個是長的前綴,短的必須在前面。Python 可以直接把單字轉成 rank 的 list 比較,list 比較本身就是字典序。

我的嘗試
#

這題提交了 12 次:

  • 第一版用 zip(*words) 一欄一欄比,每一欄都要求非遞減,但字典序只看第一個不同的字元;而且 zip 會截斷,前綴的情況沒有檢查:["ll", "l"] 回傳 True。
  • 改成相鄰兩個單字逐字比較後,先是外層迴圈跑到最後一個單字,words[i + 1] 超出範圍(IndexError)。
  • 有一版內層寫成 range(len(words[i]) - 1),少比了最後一個字元:["r", "p"] 一個字都沒比,回傳 True。
  • 修好之後,下一個單字比較短時 words[i + 1][j] 還是 IndexError。最後加上「下一個單字已經用完就回傳 False」才 AC。

正確解法
#

class Solution:
    def isAlienSorted(self, words: List[str], order: str) -> bool:
        rank = {c: i for i, c in enumerate(order)}
        keys = [[rank[c] for c in w] for w in words]
        return all(keys[i] <= keys[i + 1] for i in range(len(keys) - 1))

複雜度
#

時間 O(總字元數),空間 O(總字元數)。

要特別避免的錯誤
#

  • 只看第一個不同的字元,後面的不用比。
  • 前綴的情況:["ll", "l"] 不是排好的。
  • 存取下一個單字的字元前要確認它夠長。

面試口說整理
#

我把每個字母對應到外星順序的位置,把單字轉成位置的 list,檢查每兩個相鄰的 list 是否非遞減;list 比較本身就是字典序,前綴的情況也處理好了。時間是總字元數。

相關文章

LeetCode 929: Unique Email Addresses
·1 分鐘
LeetCode Easy Array Hash-Table String
LeetCode 929 解題筆記:用 @ 切開,只處理 local 的部分(+ 之後丟掉、去掉 .),接回 domain 後放進集合
LeetCode 819: Most Common Word
·1 分鐘
LeetCode Easy Array Hash-Table String Counting
LeetCode 819 解題筆記:標點換成空白、全部轉小寫再切單字,計數後找出不在 banned 裡的最多的那個
LeetCode 748: Shortest Completing Word
·1 分鐘
LeetCode Easy Array Hash-Table String
LeetCode 748 解題筆記:車牌只看字母並轉小寫計數,找出每個字母次數都夠的最短單字,同長度取最前面的
LeetCode 599: Minimum Index Sum of Two Lists
·1 分鐘
LeetCode Easy Array Hash-Table String
LeetCode 599 解題筆記:把 list1 的字串對應到 index,掃 list2 時算兩邊 index 的和,留下和最小的全部字串
LeetCode 804: Unique Morse Code Words
·1 分鐘
LeetCode Easy Array Hash-Table String
LeetCode 804 解題筆記:把每個單字轉成摩斯碼字串,放進集合後算有幾種
LeetCode 500: Keyboard Row
·1 分鐘
LeetCode Easy Array Hash-Table String
LeetCode 500 解題筆記:鍵盤的三列各做成集合,單字轉小寫後的字元集合是某一列的子集就保留