iT邦幫忙

2025 iThome 鐵人賽

DAY 14
0
自我挑戰組

用java解Leetcode系列 第 14

用java解Leetcode Day14

  • 分享至 

  • xImage
  •  

lhttps://ithelp.ithome.com.tw/upload/images/20250928/201695013Tzxmm6T6L.pnghttps://ithelp.ithome.com.tw/upload/images/20250928/20169501jKu3VTqwiE.png
14. Longest Common Prefix

這是關於最長共同前綴的演算法問題。

這題的目標是給定一個字串陣列(strs),要找出一個最長且所有字串都共有的前綴字串。其中,有幾個名詞需要解釋:

前綴(Prefix):一個字串開頭的部分。例如,"flow”的前綴可以是""、"f"、"fl"、"flo"、"flow"。

共同前綴(Common Prefix):如果一個字串是陣列中所有字串的前綴,它就是共同前綴。

最長共同前綴(Longest Commom Prefix, LCP):在所有共同前綴中,長度最長的那一個。

如果沒有共同前綴(例如,第一個字母就不同),則返回空字串""。

這題有很多解決方法,而其中最直觀且效率較高的方法是垂直掃描法(Vertical Scanning)。
首先,取第一個字串為基準: 假設第一個字串(strs[0])就是可能的 LCP,並以它的長度作為最長可能前綴的界線。
接著,逐字元比較:從第一個字元的索引 i=0 開始,依序往後遍歷第一個字串的每個字元。在每個索引 i 處,將第一個字串的第 i 個字元 (strs[0].charAt(i)) 與陣列中所有其他字串(strs[1] 到 strs[n-1])的第 i 個字元進行比較。
再來是終止條件: 遇到以下兩種情況,說明已經找到 LCP 的終點,此時即可返回結果:
越界: 當遍歷到某個字串的長度已經短於 i 時,表示該字串已經結束,後續字元不可能再是共同前綴。
字元不匹配: 某個字串在索引 i 上的字元與第一個字串的字元不相同。
如果是因為上述兩個條件之一而停止,那麼共同前綴就是第一個字串從開頭到索引 i 之前的部分,就可以返回結果,使用 strs[0].substring(0, i) 來取得這部分字串。
如果整個第一個字串都被掃完: 如果迴圈跑完第一個字串的所有字元都沒有觸發終止條件,表示第一個字串本身就是 LCP。

複雜度分析
時間複雜度: O(S)
S 代表所有字串的字元總數。在最差的情況下(例如 ["aaaaa", "aaaaa", "aaaaa"]),我們需要遍歷所有字串的所有字元,因此時間複雜度取決於總字元數。
更精確地說,如果 N 是字串的數量, M 是最短字串的長度,則時間複雜度為 O(N⋅M)。
空間複雜度: O(1) 或 O(M)
如果不計算返回結果字串所佔用的空間,則空間複雜度為 O(1) (只使用了固定數量的變數)。如果將返回的最長共同前綴的長度 M 也算作空間,則為 O(M)。


上一篇
用java解Leetcode Day13
系列文
用java解Leetcode14
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言