PHP 最长公共前缀算法

4次阅读

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

PHP 最长公共前缀算法

要找出字符串数组的最长公共前缀,核心思路是逐个字符比较所有字符串在相同位置上的字符是否一致,一旦发现不匹配或某字符串已到末尾,就停止并返回当前已匹配的部分。

横向扫描法(推荐初学者理解)

以第一个字符串为基准,依次与后续每个字符串比较,不断缩短公共前缀长度。

  • $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]); };

该写法可读性稍弱但体现函数式思维,实际项目中建议优先选清晰易维护的纵向扫描实现。

text=ZqhQzanResources