[LeetCode解題攻略] 14. Longest Common Prefix

更新於 發佈於 閱讀時間約 8 分鐘

題目描述

給定一組字符串,找出它們的最長公共前綴 (Longest Common Prefix)。如果沒有公共前綴,返回空字串 ""

範例 1

Input: strs = ["flower", "flow", "flight"]
Output: "fl"

    • 這些字符串的公共前綴為 "fl"

範例 2
Input: strs = ["dog", "racecar", "car"]
Output: ""

    • 這些字符串之間沒有公共前綴,返回 ""

解題思路

解決這個問題的關鍵在於如何高效地縮小範圍,找到最長公共前綴。以下列出常見的解法:

  1. 水平掃描法
    將第一個字符串作為基準,依次與後面的字符串比較並縮小公共前綴的長度。
  2. 垂直掃描法
    逐列掃描每個字符串,檢查每列的字符是否相同。如果發現不一致,立即結束。
  3. 分治法
    將字符串數組分為兩部分,遞歸地找出每部分的最長公共前綴,然後合併。
  4. 二分查找法
    以最短字符串的長度作為搜索範圍,使用二分查找法判斷某個長度是否為公共前綴。

解法 1:水平掃描法

思路

  • 將第一個字符串作為初始公共前綴,依次與其他字符串比較並縮短公共前綴,直到匹配完成或前綴為空。

實現 (Python)

class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
if not strs:
return ""

# 初始化 prefix 為第一個字符串
prefix = strs[0]

for s in strs[1:]:
# 縮短 prefix,直到找到公共部分
while not s.startswith(prefix):
prefix = prefix[:-1]
if not prefix:
return ""

return prefix

時間與空間複雜度

  • 時間複雜度:O(S),其中 S 是所有字符串字符的總數。最壞情況下,我們需要遍歷所有字符串的每個字符。
  • 空間複雜度:O(1),只需要額外的變量來存儲前綴。

解法 2:垂直掃描法

思路

  • 逐列掃描每個字符串,檢查是否所有字符串在相同位置的字符一致。一旦發現某列字符不同,立即返回當前的公共前綴。

實現 (Python)

class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
if not strs:
return ""

for i in range(len(strs[0])):
char = strs[0][i]
for s in strs[1:]:
# 如果超出長度或字符不匹配,結束掃描
if i >= len(s) or s[i] != char:
return strs[0][:i]

return strs[0]

時間與空間複雜度

  • 時間複雜度:O(S),同樣需要檢查所有字符。
  • 空間複雜度:O(1)。

解法 3:分治法

思路

  • 將字符串數組分成兩部分,遞歸地找出每部分的最長公共前綴,然後合併兩部分的結果。

實現 (Python)

class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
if not strs:
return ""

def commonPrefix(left, right):
min_len = min(len(left), len(right))
for i in range(min_len):
if left[i] != right[i]:
return left[:i]
return left[:min_len]

def divideAndConquer(strs, l, r):
if l == r:
return strs[l]
mid = (l + r) // 2
left_prefix = divideAndConquer(strs, l, mid)
right_prefix = divideAndConquer(strs, mid + 1, r)
return commonPrefix(left_prefix, right_prefix)

return divideAndConquer(strs, 0, len(strs) - 1)

時間與空間複雜度

  • 時間複雜度:O(S),每次遞歸都需要比較兩部分的前綴。
  • 空間複雜度:O(log(N)),其中 N 是字符串數組的大小,遞歸的深度最多為 log(N)。

解法 4:二分查找法

思路

  • 將最短字符串的長度作為二分查找的搜索範圍。
  • 每次檢查中間長度是否為公共前綴,並根據結果縮小範圍。

實現 (Python)

class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
if not strs:
return ""

def isCommonPrefix(length):
prefix = strs[0][:length]
return all(s.startswith(prefix) for s in strs)

min_len = min(len(s) for s in strs)
low, high = 0, min_len

while low < high:
mid = (low + high + 1) // 2
if isCommonPrefix(mid):
low = mid
else:
high = mid - 1

return strs[0][:low]

時間與空間複雜度

  • 時間複雜度:O(S × log(M)),其中 M 是最短字符串的長度,S 是所有字符串字符的總數。
  • 空間複雜度:O(1)。

總結

最推薦的解法是水平掃描法垂直掃描法,因為它們簡單直觀且能高效地處理大多數情況。如果數據規模較大,且字符串的長度有較大差異,可以考慮分治法二分查找法進一步優化。


留言
avatar-img
留言分享你的想法!
avatar-img
追極光的北極熊|軟體工程師的小天地
7會員
133內容數
歡迎來到我的部落格!這裡記錄了軟體工程師的日常生活點滴,並分享程式設計與演算法的實用教學。無論你是初學者還是有經驗的開發者,都能在這裡找到深入淺出的技術解析與實戰技巧。此外,我也會分享工作中的心路歷程與學習心得,讓你不僅學到技術,更能瞭解軟體開發的實際應用與挑戰。希望透過這個平台,能與你共同成長,激發對技術的熱情!
2025/04/04
給定一個非負整數陣列 nums,其中 nums[i] 代表你在索引 i 處最多可以向右跳幾步。 請判斷是否能夠從索引 0 跳到最後一個索引。
2025/04/04
給定一個非負整數陣列 nums,其中 nums[i] 代表你在索引 i 處最多可以向右跳幾步。 請判斷是否能夠從索引 0 跳到最後一個索引。
2025/03/28
給定一個 m x n 的矩陣 matrix,請按照 螺旋順序(spiral order) 返回矩陣中的所有元素。
2025/03/28
給定一個 m x n 的矩陣 matrix,請按照 螺旋順序(spiral order) 返回矩陣中的所有元素。
2025/03/20
這道題是 LeetCode 的經典題之一,要求我們找出 一個子陣列,使其和最大,並返回這個最大和的數值。
2025/03/20
這道題是 LeetCode 的經典題之一,要求我們找出 一個子陣列,使其和最大,並返回這個最大和的數值。
看更多
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
1371. Find the Longest Substring Containing Vowels in Even Counts 給定一個字串s,請找出母音字母出現皆為偶數次的最長子字串的長度。 例如"paaoooq",母音字母出現皆為偶數次的最長子字串paaoo,長度為5。
Thumbnail
1371. Find the Longest Substring Containing Vowels in Even Counts 給定一個字串s,請找出母音字母出現皆為偶數次的最長子字串的長度。 例如"paaoooq",母音字母出現皆為偶數次的最長子字串paaoo,長度為5。
Thumbnail
題目敘述 Longest Palindromic Subsequence 給定一個字串s,請找出字串s的最長回文子序列的長度。 註: 子序列 不要求一定要連續。 測試範例 Input: s = "bbbab" Output: 4
Thumbnail
題目敘述 Longest Palindromic Subsequence 給定一個字串s,請找出字串s的最長回文子序列的長度。 註: 子序列 不要求一定要連續。 測試範例 Input: s = "bbbab" Output: 4
Thumbnail
題目敘述 題目會給定兩個輸入字串str1和str2,要求我們找出這兩個字串的最大共同子字串。 如果無解,則返回空字串""。 題目的原文敘述 測試範例 Example 1: Input: str1 = "ABCABC", str2 = "ABC" Output: "ABC" Exam
Thumbnail
題目敘述 題目會給定兩個輸入字串str1和str2,要求我們找出這兩個字串的最大共同子字串。 如果無解,則返回空字串""。 題目的原文敘述 測試範例 Example 1: Input: str1 = "ABCABC", str2 = "ABC" Output: "ABC" Exam
Thumbnail
這題也是滿經典的DP動態規劃教學案例和題目,就順便複習一下吧。 題目敘述 題目會給我們兩個字串text1, text2。 要求我們找出兩個字串的最長共同子序列,並且返回最長共同子序列的長度。 如果彼此沒有共同子序列,則返回0。 題目的原文敘述 測試範例 Example 1: In
Thumbnail
這題也是滿經典的DP動態規劃教學案例和題目,就順便複習一下吧。 題目敘述 題目會給我們兩個字串text1, text2。 要求我們找出兩個字串的最長共同子序列,並且返回最長共同子序列的長度。 如果彼此沒有共同子序列,則返回0。 題目的原文敘述 測試範例 Example 1: In
Thumbnail
題目 : 14. Longest Common Prefix
Thumbnail
題目 : 14. Longest Common Prefix
Thumbnail
題目會給定我們一個字串s,要求我們計算出同質子字串有幾個? 同質子字串的定義就是子字串內部的字元都相同,例如a, aa, aaa, ... 等等這些就是同質子字串。
Thumbnail
題目會給定我們一個字串s,要求我們計算出同質子字串有幾個? 同質子字串的定義就是子字串內部的字元都相同,例如a, aa, aaa, ... 等等這些就是同質子字串。
Thumbnail
題目會給定一個字串s,裡面都是由() [] {}打散交錯而成。 問我們給定的輸入字串s裡面,最長的合法括弧配對字串長度是多少? 例如 s = "()()" ,最長的合法括弧配對字串長度為4
Thumbnail
題目會給定一個字串s,裡面都是由() [] {}打散交錯而成。 問我們給定的輸入字串s裡面,最長的合法括弧配對字串長度是多少? 例如 s = "()()" ,最長的合法括弧配對字串長度為4
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News