78 题(最长公共前缀)

继续用「快刷四部曲」把 78 题(最长公共前缀)5 分钟秒掉。

(模板记忆点:① 纵向扫描;② 一旦失配立即 return;③ 空数组特护。)


① 抽象模型

k 个字符串,求从左端开始的最长公共子串。

等价于:对第 0 列、第 1 列...逐列检查,直到某一列字符不全相同或某个字符串已经到头。


② 最优算法

时间:O(totalLen) 所有字符最多被看一次。

空间:O(1) 原地比对。

算法:

  1. 特护:strs == null || strs.length == 0 → return ""
  2. 令 minLen = 最短字符串长度
  3. 逐列 col = 0 ... minLen-1
    • 取 strs0.charAt(col) 作为基准
    • 遍历 i = 1...k-1,若 strsi.charAt(col) ≠ 基准 → 立即 return strs0.substring(0, col)
  4. 循环结束 return strs0.substring(0, minLen)

③ 边界/异常

  • 空数组 ⇒ ""
  • 含空串 ⇒ ""
  • 仅一个字符串 ⇒ 它自身

④ 代码(Java,可直接粘 LintCode)

java 复制代码
public String longestCommonPrefix(String[] strs) {
    if (strs == null || strs.length == 0) return "";
    int minLen = Integer.MAX_VALUE;
    for (String s : strs) minLen = Math.min(minLen, s.length());
    for (int col = 0; col < minLen; col++) {
        char c = strs[0].charAt(col);
        for (int i = 1; i < strs.length; i++) {
            if (strs[i].charAt(col) != c) {
                return strs[0].substring(0, col);
            }
        }
    }
    return strs[0].substring(0, minLen);
}

复杂度:

时间 O(∑len),空间 O(1)。

写完,Submit,一遍 AC。

相关推荐
qeen8734 分钟前
【数据结构】自平衡二叉搜索树各种旋转算法原理解析及AVL树的C++实现
数据结构·c++·算法
冻柠檬飞冰走茶2 小时前
PTA基础编程题目集 7-35有理数均值(C++语言实现)
开发语言·数据结构·c++·算法·均值算法
Nil2083 小时前
leetcode 189轮转数组
数据结构·算法·leetcode
依然鸣4 小时前
PTA团体程序设计天梯赛L1真题讲解L1-085-088
数据结构·c++·经验分享·算法·深度优先·pat考试
Brilliantwxx5 小时前
【算法从零到千】【51-54】逆序对(分治+递归算法)
数据结构·算法·排序算法
小星星闪亮登场5 小时前
2026河南萌新联赛第四场--南阳理工学院
数据结构·算法·贪心算法·动态规划·哈希算法·广度优先
土司大王5 小时前
LeetCode hot100——两数之和
数据结构·算法·leetcode
wabs6666 小时前
关于字符串【力扣344.反转字符串的思考】
数据结构·算法·leetcode
LuminousCPP6 小时前
数据结构基础篇(二):顺序表与链表全方位对比|从内存布局到 CPU 缓存理解底层差异
c语言·数据结构·经验分享·链表·缓存
有点。6 小时前
C++二叉树(一)
开发语言·数据结构·c++