PHP实现求两个字符串最长公共子串的方法示例

PHP实现求两个字符串最长公共子串的方法示例

问题描述

在字符串处理过程中,有时候需要找到两个字符串的最长公共子串。例如,在“abcdefg”和“bcdehijk”这两个字符串中,最长公共子串为“bcde”。在PHP中,我们可以用一些算法实现寻找最长公共子串。

算法实现

1.暴力枚举

暴力枚举是一种常见的寻找最长公共子串的方法,其时间复杂度为$O(mn^2)$,其中$m$和$n$分别为两个字符串的长度。其实现步骤如下:

  1. 遍历第一个字符串的每一个字母。
  2. 针对每一个第一个字符串的字母,遍历第二个字符串,并找到与它相同的字母。
  3. 找到相同的字母之后,遍历两个字符串的下一个字母,直到找到不相同的字母为止。
  4. 此时,记录下找到的串的长度和起始位置,继续执行步骤1、2、3,直到第一个字符串的所有字母都遍历完成。

下面是用PHP语言实现暴力枚举的代码示例:

function findLongestCommonSubstring(string $str1, string $str2): string
{
    $result = '';
    $length1 = strlen($str1);
    $length2 = strlen($str2);
    for ($i = 0; $i < $length1; $i++) {
        for ($j = 0; $j < $length2; $j++) {
            $k = 0;
            while (($i + $k < $length1) && ($j + $k < $length2) && ($str1[$i + $k] == $str2[$j + $k])) {
                $k++;
            }
            if ($k > strlen($result)) {
                $result = substr($str1, $i, $k);
            }
        }
    }
    return $result;
}

2. 动态规划

动态规划是一种常见的寻找最长公共子串的方法,其时间复杂度为$O(mn)$。其实现步骤如下:

  1. 建立一个$m$行$n$列的二维数组$dp$,其中$dp[i][j]$表示以字符串1中第$i$个字符为结尾,以字符串2中第$j$个字符为结尾的最长公共子串的长度。
  2. 遍历两个字符串,当发现两个字符串的一个字符相同时,令$dp[i][j] = dp[i-1][j-1] + 1$,否则$dp[i][j] = 0$。
  3. 在$dp$数组中找到最大值,记录其位置和长度,即可找到最长公共子串。

下面是用PHP语言实现动态规划的代码示例:

function findLongestCommonSubstring(string $str1, string $str2): string
{
    $result = '';
    $length1 = strlen($str1);
    $length2 = strlen($str2);
    $dp = array_fill(0, $length1 + 1, array_fill(0, $length2 + 1, 0));
    $maxLen = 0;
    $maxColumn = 0;
    for ($i = 1; $i <= $length1; $i++) {
        for ($j = 1; $j <= $length2; $j++) {
            if ($str1[$i - 1] == $str2[$j - 1]) {
                $dp[$i][$j] = $dp[$i - 1][$j - 1] + 1;
                if ($dp[$i][$j] > $maxLen) {
                    $maxLen = $dp[$i][$j];
                    $maxColumn = $j;
                }
            }
        }
    }
    if ($maxLen > 0) {
        $result = substr($str2, $maxColumn - $maxLen, $maxLen);
    }
    return $result;
}

示例说明

示例1

输入字符串1为“abcdefg”,字符串2为“bcdehijk”,输出字符串“bcde”。

使用暴力枚举的方法:

$str1 = 'abcdefg';
$str2 = 'bcdehijk';
$result = findLongestCommonSubstring($str1, $str2);
echo $result; // bcde

使用动态规划的方法:

$str1 = 'abcdefg';
$str2 = 'bcdehijk';
$result = findLongestCommonSubstring($str1, $str2);
echo $result; // bcde

示例2

输入字符串1为“hello world”,字符串2为“world hello”,输出字符串“world”。

使用暴力枚举的方法:

$str1 = 'hello world';
$str2 = 'world hello';
$result = findLongestCommonSubstring($str1, $str2);
echo $result; // worl

使用动态规划的方法:

$str1 = 'hello world';
$str2 = 'world hello';
$result = findLongestCommonSubstring($str1, $str2);
echo $result; // world

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP实现求两个字符串最长公共子串的方法示例 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • PHP中类型转换 ,常量,系统常量,魔术常量的详解

    PHP中类型转换、常量、系统常量、魔术常量的详解 类型转换 PHP中的类型转换可以分为两种情况,自动类型转换和强制类型转换。 1. 自动类型转换 自动类型转换是指PHP根据当前运算操作符的类型及各变量的数据类型,自动将变量的数据类型进行转换以完成运算或操作。 例如: $a = 10; $b = ’20’; $c = $a + $b; // 自动将$b转换为i…

    PHP 2023年5月26日
    00
  • 解析php中获取系统信息的方法

    获取系统信息可以使用PHP内置函数或者系统命令来实现。以下是具体的方法: 使用PHP内置函数 1. phpinfo()函数 可以使用phpinfo()函数获取到PHP当前运行环境的所有配置和扩展信息,包括系统信息、PHP版本信息、PHP配置信息、搜索路径等。示例代码如下: <?php phpinfo(); ?> 2. get_loaded_ext…

    PHP 2023年5月30日
    00
  • PHP配合微信小程序实现获取手机号码详解

    下面是PHP配合微信小程序实现获取手机号码的完整攻略: 一、背景知识 在使用微信小程序开发中,有时候需要获取用户授权后的手机号码信息。但是,仅仅使用微信小程序的API是不够的,需要服务端提供支持。本攻略将涉及到前端(微信小程序)、后端(PHP)、数据库等多个方面的知识。 二、前置条件 微信开发者工具 PHP环境 数据库 三、步骤 1. 前端代码编写 微信小程…

    PHP 2023年5月23日
    00
  • 可以在线执行PHP代码包装修正版

    安装必要的开发环境首先需要安装PHP的运行环境以及Apache或Nginx服务器,以便可以本地运行PHP代码并进行测试。推荐使用Windows环境下的XAMPP或者MacOS环境下的MAMP等集成开发环境,可以方便的一次性安装PHP、Apache以及MySQL等必要的开发环境。 下载可执行文件可以找到一个PHP在线执行器的GitHub项目或其他可供下载的可执…

    PHP 2023年5月23日
    00
  • 深入PHP获取随机数字和字母的方法详解

    深入PHP获取随机数字和字母的方法详解 随机数是在编程中经常用到的一个功能。在PHP中,可以使用rand()函数、mt_rand()函数、shuffle()函数、array_rand()函数等多种方法来生成随机数。然而,如果需要生成随机的数字和字母组成的字符串,则需要采用其他方法。下面我们将深入介绍如何在PHP中获取随机数字和字母。 方法一:使用shuffl…

    PHP 2023年5月26日
    00
  • PHP经典算法集锦【经典收藏】

    PHP 经典算法集锦【经典收藏】攻略 什么是 PHP 经典算法集锦【经典收藏】? PHP 经典算法集锦是一本涵盖 PHP 常见算法题目的书籍,包含了大量 PHP 编写的算法示例,是广大 PHP 工程师们学习和提升算法编程能力的重要参考资料。 该书的主要内容分为以下部分: 数值操作相关算法 字符串相关算法 数组相关算法 链表相关算法 树相关算法 查找与排序算法…

    PHP 2023年5月23日
    00
  • 用php发送带附件的Email

    以下是使用PHP发送带附件的Email的完整攻略。 一、准备工作 在使用PHP发送带附件的Email之前,需要准备好以下工作: 确保你已经安装并配置好SMTP服务器,可以使用php.ini文件或PHP邮件类库进行设置。 确保你已经了解PHP邮件类库的使用方法,并按需安装。 确定要发送的附件,并将其存储在服务器磁盘上。 二、发送带附件的Email 发送带附件的…

    PHP 2023年5月26日
    00
  • 微信小程序开发实现消息推送

    关于“微信小程序开发实现消息推送”的完整攻略,我们可以分成以下几个步骤: 步骤一:申请模板消息接口权限 首先我们需要在微信公众平台上申请“模板消息”的接口权限,这样才能在小程序中使用消息推送功能。具体操作步骤可以参考微信公众平台的官方文档:模板消息接口权限申请流程。 步骤二:准备模板消息 在获得了模板消息接口权限之后,我们需要准备一些消息模板,方便我们在代码…

    PHP 2023年5月30日
    00
合作推广
合作推广
分享本页
返回顶部