最长公共前缀通过横向或纵向扫描实现:横向以首字符串为基准逐个截短比较,纵向按列逐字符比对;需处理空数组、单字符串、空串等边界情况。

要找出字符串数组的最长公共前缀,核心思路是逐个字符比较所有字符串在相同位置上的字符是否一致,一旦发现不匹配或某字符串已到末尾,就停止并返回当前已匹配的部分。
横向扫描法(推荐初学者理解)
以第一个字符串为基准,依次与后续每个字符串比较,不断缩短公共前缀长度。
- 取 $prefix = $strs[0] 作为初始前缀
- 遍历其余字符串,对每个 $str,用 substr($str, 0, strlen($prefix)) !== $prefix 判断是否匹配
- 不匹配时,将 $prefix 末尾字符截掉($prefix = substr($prefix, 0, -1)),重复比较,直到匹配或变为空串
- 若某轮循环中 $prefix 变为空,可提前返回 ""
纵向扫描法(更高效,适合多数场景)
按列扫描:先比所有字符串第 0 个字符,再比第 1 个,依此类推,遇到不一致或越界即停。
- 外层循环控制列索引 $i,从 0 开始,上限为第一个字符串长度
- 内层遍历所有字符串,检查 $strs[$j][$i] 是否存在且等于 $strs[0][$i]
- 任一字符串长度 ≤ $i 或字符不等,立即返回 substr($strs[0], 0, $i)
- 若全部列都通过,说明第一个字符串整体就是答案
边界情况处理要点
算法健壮性取决于对这些情况的预判:
立即学习“PHP免费学习笔记(深入)”;
- 输入为空数组:return ""
- 数组只含一个字符串:return $strs[0]
- 含空字符串:一旦遇到,直接返回 ""(因公共前缀不可能长于空串)
- 大小写敏感?题目未说明时默认区分,如需忽略,可用 strtolower() 统一预处理
一行函数式写法(进阶参考)
借助 array_reduce 可简洁实现横向扫描逻辑:
$longestCommonPrefix = function($strs) {
if (!$strs) return "";
return array_reduce($strs, function($carry, $item) {
$len = min(strlen($carry), strlen($item));
for ($i = 0; $i < $len && $carry[$i] === $item[$i]; $i++);
return substr($carry, 0, $i);
}, $strs[0]);
};
该写法可读性稍弱但体现函数式思维,实际项目中建议优先选清晰易维护的纵向扫描实现。











