题目描述
求字符串数组的最长公共前缀,没有则返回空串。
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] 会越界)
以上文字与上方动画完全同一思路:先看动画建立直觉 → 读文字巩固 → 关掉页面自己默写一遍代码,能写出来才算真的掌握。