最长公共前缀问题来自力扣:https://leetcode-cn.com/problems/longest-common-prefix/
- 最大最小字符串法
按照字典序给整个数组排序,最大字符串和最小字符串的公共前缀就是整个数组的公共前缀。
/**
* 最大最小字符串法
* @param String[] $strs
* @return String
*/
function longestCommonPrefix1($strs)
{
$commStr = ''; //最长公共前缀
$min = min($strs); //字典序排序的最小字符串
$max = max($strs); //字典序排序的最大字符串
//最大字符串和最小字符串的公共前缀就是整个数组的公共前缀
for ($i = 0; $i < strlen($min); $i++) {
if ($min[$i] != $max[$i]) {
break;
}
$commStr .= $min[$i];
}
return $commStr;
}
- 水平扫描法
首先假设最长公共前缀commStr是第一个元素, 遍历数组,依次与commStr做比较,找出其最长前缀,然后更新commStr,再进行下一次比较。
/**
* 水平扫描法
* @param String[] $strs
* @return String
*/
function longestCommonPrefix2($strs)
{
$commStr = $strs[0]; //假设最长公共前缀是第一个元素
for ($i = 1; $i < count($strs); $i++) {
$commStrTmp = '';
for ($j = 0; $j < strlen($commStr); $j++) {
if (!isset($strs[$i][$j]) || $commStr[$j] != $strs[$i][$j]) {
break;
}
$commStrTmp .= $commStr[$j];
}
$commStr = $commStrTmp;
}
return $commStr;
}
- 比较首元素法
对 strs[0]
按字符遍历,与其他字符串依次比较对应位置上的字符,判断是否每个字符串的这个字符都相等,如果不相等或者对应字符串的长度到了限制,那最长公共前缀就找到了。
/**
* 比较首元素法
* @param String[] $strs
* @return String
*/
function longestCommonPrefix3($strs)
{
$commStr = ''; //最长公共前缀
//遍历第一个字符串的每一个字符
for ($i = 0; $i < strlen($strs[0]); $i++) {
$char = $strs[0][$i];
//遍历每一个字符串
for ($j = 1; $j < count($strs); $j++) {
//如果$i已经超过了当前字符串的长度,或者$char与当前字符串的当前字符不相等,则跳出两层循环
if ($i >= strlen($strs[$j]) || $char != $strs[$j][$i]) {
break 2;
}
}
$commStr .= $char;
}
return $commStr;
}