首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

LeetCode 14:最長公共前綴 —— 多種解法對比與優化

     編輯:關於C++

題目

編寫函數查找字符串數組中的最長公共前綴。若不存在公共前綴,返回空字符串 ""。

核心思路對比

方法思路時間複雜度備註
橫向掃描以第一個串為基準,依次與其餘串比對縮短前綴O(S)S 為所有字符總長,簡單直觀
縱向掃描逐列比對所有串的第 i 個字符O(S)最壞情況同橫向,平均更快(提前終止)
分治左右半遞歸求 LCP,再合併O(S)適合並行化
二分查找在第一個串長度上二分長度,驗證是否為公共前綴O(S log m)m 為最短串長
排序法排序後只需比對首尾兩串O(N log N * m)代碼極短,常數較大

推薦實現:縱向掃描(最優常數)

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        if (strs.empty()) return "";
        for (int i = 0; i < strs[0].size(); ++i) {
            char c = strs[0][i];
            for (int j = 1; j < strs.size(); ++j) {
                if (i == strs[j].size() || strs[j][i] != c)
                    return strs[0].substr(0, i);
            }
        }
        return strs[0];
    }
};

排序法(代碼最短)

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        if (strs.empty()) return "";
        sort(strs.begin(), strs.end());
        string &first = strs.front(), &last = strs.back();
        int i = 0;
        while (i < first.size() && i < last.size() && first[i] == last[i]) ++i;
        return first.substr(0, i);
    }
};

Python 精簡版

class Solution:
    def longestCommonPrefix(self, strs):
        if not strs: return ""
        for i, chars in enumerate(zip(*strs)):
            if len(set(chars)) > 1:
                return strs[0][:i]
        return min(strs)  # 全匹配時返回最短串

# 分治法 44ms
    def longestCommonPrefix(self, strs):
        if not strs: return ""
        def lcp(l, r):
            if l == r: return strs[l]
            mid = (l + r) // 2
            left, right = lcp(l, mid), lcp(mid+1, r)
            i = 0
            while i < len(left) and i < len(right) and left[i] == right[i]: i += 1
            return left[:i]
        return lcp(0, len(strs)-1)

關鍵優化點

  1. 早退:發現不匹配立即返回,避免多餘比較。
  2. 基準選擇:用最短串作基準可減少循環次數。
  3. 避免 substr 複製:C++ 中用 string_view (C++17) 或索引範圍延遲構造結果。

複雜度總結

  • 時間:O(S),S 為所有字符總數。
  • 空間:O(1)(不計輸出),排序法 O(log N) 棧空間。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved