图解题库 / 字符串 · 扫描

14. 最长公共前缀

简单 含交互动画

学完这道你应该能: 说清它为什么用「扫描」,而不是死记步骤; 合上页面,自己默写出核心代码; 用 30 秒把思路讲清楚。

题目描述

求字符串数组的最长公共前缀,没有则返回空串。

strs = ["flower", "flow", "flight"]
输出 = "fl"

思路解析

咱们拿第一个词当基准,逐列(第 0 列、第 1 列……)检查:当前列上,所有词的字符是不是都和基准一样?只要有一个不同,或者某个词到头了,就停——前面已经对齐的部分就是答案。

第 0 列 · 都是 f ✓:(下面用基准词 "flower" 演示)第 0 列:flower/flow/flight 的首字母都是 f,一样,纳入公共前缀。

第 1 列 · 都是 l ✓:第 1 列:都是 l,一样。公共前缀到了 "fl"。

第 2 列 · o vs o vs i ✗:第 2 列:flower 是 o、flow 是 o、但 flight 是 i——不一样!立刻停。

结果 · "fl":在第 2 列断开,前面已经对齐的 "fl" 就是最长公共前缀。

“公共前缀”这个问题的直觉,就是把多个词竖着排,一列一列对齐。这种“纵向对齐”的思路在很多处理多个字符串的问题里都能用上。

参考代码(Python)

Python
1if not strs: return class="cl-str">""
2for i in range(len(strs[0])):          # 以第一个词逐列
3    c = strs[0][i]
4    for s in strs[1:]:
5        if i >= len(s) or s[i] != c:   # 到头 或 不同
6            return strs[0][:i]         # 前面就是答案
7return strs[0]                         # 第一个词就是公共前缀

复杂度分析

  • 时间复杂度:O(S) —— S 是所有字符总数
  • 空间复杂度:O(1) —— 只存结果

套路模板

记住骨架:以首词逐列、其余词比该列、越界或不等就截断返回。简单可靠,是处理“多个字符串共同部分”的常用方法。

Python
1for i in range(len(strs[0])):          # 列
2    for s in strs[1:]:                 # 每个词的该列
3        if i >= len(s) or s[i] != strs[0][i]:
4            return strs[0][:i]         # 第一处不齐即止
5return strs[0]

易错点

  • 忘了某个词更短 → ✅ i >= len(s) 也要截断(前缀不能超过最短的那个词)
  • 没处理空数组 → ✅ 先判 strs 为空返回 ""(否则 strs[0] 会越界)

以上文字与上方动画完全同一思路:先看动画建立直觉 → 读文字巩固 → 关掉页面自己默写一遍代码,能写出来才算真的掌握

下一题 →28. 字符串匹配 (KMP) ← 返回题库