題目描述:給定一個字串陣列 strs,找出所有字串中最長的公共前綴。若不存在公共前綴,回傳空字串 ""。
解題思路:最直觀的方法是以第一個字串為基準,逐字元與其餘所有字串比較。使用兩層迴圈:外層迴圈遍歷第一個字串的每個字元位置 j,內層迴圈遍歷所有其他字串,檢查它們在位置 j 的字元是否與第一個字串相同。
遇到以下任一情況時立即停止並回傳當前已確認的前綴:
此方法最壞情況下需比較所有字元,但一旦發現不匹配就能提前終止,實際效率通常很好。
時間複雜度:O(S) — S 為所有字串的字元總數。最壞情況下(所有字串完全相同),需要比較每個字元一次。實際上,當發現不匹配時會提前返回,平均情況遠優於最壞情況。
空間複雜度:O(1) — 只使用常數個額外變數。回傳的子字串不計入額外空間。
1. If strs is empty, return ""
2. For j from 0 to len(strs[0]) - 1:
a. c = strs[0][j] (character at position j in reference string)
b. For i from 1 to len(strs) - 1:
- If j >= len(strs[i]) OR strs[i][j] != c:
Return strs[0][0..j-1] (prefix up to (not including) position j)
3. Return strs[0] (entire first string is the common prefix)方法一:排序後只比較首尾字串 對字串陣列排序,公共前綴只需比較字典序最小和最大的字串(即排序後的第一個和最後一個)。因為中間的字串一定不比這兩者更「極端」。時間複雜度 O(S log n)(S 為字元總數,排序主導),空間複雜度 O(1)(忽略排序內部空間)。
方法二:Trie(字典樹) 將所有字串插入 Trie,從根節點開始沿路徑走,直到遇到某節點有多個子節點或標記為字串結尾為止。時間複雜度 O(S)(建樹),空間複雜度 O(S)(Trie 節點數)。適合需要多次查詢的場景,但單次查詢建 Trie 成本偏高。