PHP查找多个字符串的公共前缀【案例】
本篇和大家分享一个小算法的应用——查找字符串数组的公共前缀:
array(
'abcdefg',
'abcdfio',
'abcdqle'
)
上面的数组字符串中,公共前缀为’abcd’。
首先想到的是从第一个字符串的第一个字符开始,依次与其它字符串的字符比较,都相等的我们将其保存起来,直到有一个不相等就结束后续的比较。
代码如下
function commonPrefix($arr){
$count = strlen($arr[0]);
$prefix = '';
for($i=0;$i<$count;$i++){
$char = $arr[0][$i];
$flag = true;
foreach($arr as $val){
if($char != $val[$i]){
$flag = false;
break;
}
}
if(!$flag) break;
$prefix .= $char;
}
return $prefix;
}
这段代码能很好的找出上面字符串数组的公共前缀。
但是上面那段程序存在一个比较严重的bug。当数组中有的字符串的长度比第一个字符串的长度小的时候就有可能出现错误。我们看下面的数组:
array(
'abcde',
'abc',
'abcrhgh',
'abcdfg',
'abcfg'
);
我们看上面的数组知道,公共前缀为abc。在程序进行对比的过程中,当比较第四个字符d的时候,我们看第二个字符串是不是只有三个字符。因此$arr[1][3]没有这个变量。因此会报错。
针对这种情况有两种解决方法
方法一、每次进行对比之前判断变量是否存在,如果不存在的话直接结束后续的比较。
部分代码如下:
foreach($arr as $val){
if(!isset($val[$i]){
$flag = false;
break;
}
if($char != $val[$i]){
$flag = false;
break;
}
}
方法二、在进行查找对比之前,先找出数组中最短字符串的长度。以此长度作为循环的终止条件。
代码如下:
function commonPrefix($arr){
$count = strlen($arr[0]);
for($i = 0;$i<count($arr);$i++){
if(strlen($arr[$i]) <= $count){
$count = strlen($arr[$i]);
}
}
$prefix = '';
for($i=0;$i<$count;$i++){
$char = $arr[0][$i];
$flag = true;
foreach($arr as $val){
if($char != $val[$i]){
$flag = false;
break;
}
}
if(!$flag) break;
$prefix .= $char;
}
return $prefix;
}
以上就是整个查找字符串数组中公共前缀的代码。希望对大家有所帮助。
相关文章
PHP中使用的GC算法
发布时间:2023/02/23 浏览次数:187 分类:PHP
-
PHP 使用垃圾收集器 (GC) 来自动管理变量和对象使用的内存。 PHP 使用的 GC 算法是 标记清除 算法的变体。 标记清除算法的工作原理是将内存分为两部分: 使用中 堆和 空闲 堆。 使用中
深入理解 Nginx Location 块匹配算法
发布时间:2022/01/15 浏览次数:76 分类:网络
-
与 Nginx 用于选择将处理请求的 Server 块的过程类似,Nginx 也有一个既定的算法来决定 Server 块中的哪个 Location 块用于处理请求。
深入理解 Nginx 的 Server 块选择算法
发布时间:2022/01/13 浏览次数:91 分类:网络
-
在本篇文章中,我们将讨论一些决定 Nginx 处理客户端请求的细节。 了解这些可以帮助我们在设计 Server 和 Location 时更加得心应手,对于一些请求的现象不至于迷惑。
全面了解归并排序算法及代码实现
发布时间:2021/08/19 浏览次数:275 分类:算法
-
归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。这里拆分过程的代码可以分为两种方式:递归实现和非递归实现
我对Paxos算法的理解
发布时间:2017/03/31 浏览次数:1221 分类:算法
-
本文介绍了Paxos最基本的算法,从proposer、learner和acceptor各自的角度提出了算法的步骤。
Memcached中的分布式思想
发布时间:2017/03/28 浏览次数:468 分类:算法
-
Memcached中的分布式主要体现在客户端的实现,在客户端实现对Memcached分发过程中利用了Hash算法,优化的算法是使用了Consistent Hashing(一致性hash算法)。