迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 算法 >

PHP查找多个字符串的公共前缀【案例】

作者:迹忆 最近更新:2022/12/11 浏览次数:

本篇和大家分享一个小算法的应用——查找字符串数组的公共前缀:

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;
}

以上就是整个查找字符串数组中公共前缀的代码。希望对大家有所帮助。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

C# 中的多案例切换语句

发布时间:2024/01/18 浏览次数:102 分类:编程语言

有两种可用于在 C# 中创建多大小写 switch 语句的语法,即常规 switch 语句和基于范围的 switch 语句。

在 Java 中实现 Dijkstra 算法

发布时间:2023/11/28 浏览次数:147 分类:Java

本教程描述并演示了 Java 中的 Dijkstra 算法。当找到两个图节点之间的最短路径时,我们可以实现 Dijkstra 算法,这是一种广泛使用的算法。

Java 中的选择排序算法

发布时间:2023/10/17 浏览次数:153 分类:Java

本教程演示了 Java 中的选择排序算法。选择排序是首先选择列表或数组中最小的元素并与第一个元素或数组交换的方法;然后,第二个缩小的元素与第二个元素交换。

Java 基数排序算法

发布时间:2023/10/17 浏览次数:206 分类:Java

本教程详细解释了基数排序算法并演示了 Java 中的实现。在基数排序算法中,元素的排序首先将具有相同位值的单个数字分组,然后按照升序或降序排序。本教程详细解释了基数排序算法,并演

C++ 中最快的排序算法

发布时间:2023/08/31 浏览次数:164 分类:C++

本文将解释哪种排序算法在什么条件下表现最好。 条件包括数据结构的类型、排序数据的大小、数据排列和数据元素的范围。

Java最快的排序算法

发布时间:2023/07/16 浏览次数:164 分类:Java

本文将介绍两种最快的排序算法并用 Java 编写它们的代码。第一种技术是计数排序,它有一些局限性。 因此,我们还将介绍合并排序算法。 Java中的计数排序算法 Java中的归并排序算法

Python Apriori 算法

发布时间:2023/06/30 浏览次数:236 分类:Python

Apriori 算法指出,如果一个项集是频繁的,那么它的所有非空子集也必须是频繁的。 本篇文章展示了如何使用 Python 中的 apyori 模块逻辑来实现这一点。

Python 中的 Rabin-Karp 算法

发布时间:2023/06/30 浏览次数:168 分类:Python

我们将介绍 Python 中的 Rabin-Karp 算法,并讨论如何在 Python 程序中使用它。Python 中的 Rabin-Karp 算法 Rabin-Karp 算法从给定的输入或值中查找特定的数字、字母或模式。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便