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

LeetCode 14: Longest Common Prefix

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

基本資料
#

難易度: easy 第一次嘗試:2019-09-19

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

解題思路
#

共同前綴不會比最短的字串長。用 zip(*strs) 一次取出所有字串在同一個位置的字元,全部相同就繼續,第一個不同的位置就停。迴圈正常跑完代表最短的字串整個都是前綴,這個情況也要回傳。

我的嘗試
#

2019 年第一次只寫了兩行特殊情況就送出。2022-05 用「最短字串逐位比對」就 AC 了。2022-08 改用 zip(*strs) 重寫,錯了十次,幾乎都是同一個問題:

  • 迴圈正常跑完時沒有回傳,只在遇到不同時才 return:[""] 這種 zip 一次都沒跑的情況回傳 None。
  • 補上之後回傳的是 "",但跑完代表最短字串整個都是前綴:["a"] 答案 "a",回傳 ""。最後改回最短字串的寫法才 AC。

正確解法
#

class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        n = 0
        for chars in zip(*strs):
            if len(set(chars)) != 1:
                break
            n += 1
        return strs[0][:n]

複雜度
#

時間 O(總字元數),空間 O(m)(m 是字串數量)。

要特別避免的錯誤
#

  • 迴圈結束後也要回傳,不然最短字串整個都是前綴時會回傳 None。
  • 有空字串時 zip 一次都不會執行,答案是空字串。

面試口說整理
#

我用 zip 把所有字串同一個位置的字元一起取出來,全部相同就把長度加一,遇到第一個不同就停,最後回傳第一個字串的前面那段。時間是總字元數。

相關文章

LeetCode 1: Two Sum
·1 分鐘
LeetCode Easy Array Hash-Table
LeetCode 1 解題筆記:一邊掃一邊把看過的數存進雜湊表,查 target - x 有沒有出現過;先查再存,同一個元素才不會用兩次
LeetCode 13: Roman to Integer
·1 分鐘
LeetCode Easy Hash-Table Math String
LeetCode 13 解題筆記:從左到右加每個符號的值,如果它比右邊的符號小就改成減
LeetCode 9: Palindrome Number
·1 分鐘
LeetCode Easy Math
LeetCode 9 解題筆記:負數一定不是回文;不轉字串的話,把後半段的數字反轉,跟前半段比較
LeetCode 7: Reverse Integer
·1 分鐘
LeetCode Medium Math
LeetCode 7 解題筆記:記下正負號,對絕對值反轉位數,結果超出 32 位元有號整數的範圍就回傳 0