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

yizhihongxing

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是一种广泛使用的服务器端脚本语言,可以创建动态的网页内容、发送和接收Cookie等。本教程将介绍PHP的基础概念,如语法、变量、运算符和控制结构等。 环境要求和安装 为了开始学习PHP,您需要一个运行PHP代码的web服务器,可以选择从下面的网址下载并安装: WAMP MAMP XAMPP 其中,XAMPP是最流行的,它支持Wi…

    PHP 2023年5月23日
    00
  • html静态页面调用php文件的方法

    下面是HTML静态页面调用PHP文件的方法的完整攻略: 1. 配置web服务器以支持PHP 在运行PHP文件之前,必须安装Web服务器(例如Apache、nginx等)并启用PHP解析器。详细安装有关Apache和PHP的信息,请参阅官方文档。 2. 编写HTML页面 在您的文本编辑器中创建一个HTML文件。 例如,以下是一个简单的HTML模板,其中引用了一…

    PHP 2023年5月23日
    00
  • 3种方法轻松处理php开发中emoji表情的问题

    这里给您详细介绍一下“3种方法轻松处理php开发中emoji表情的问题”。 什么是Emoji Emoji是一种绘文字,也叫表情符号,通常用于在文本信息中表达情感、表达状态或强调关键字。随着智能手机和社交媒体的普及,Emoji表情已经成为现代人交流中不可或缺的一部分。 PHP开发中Emoji表情的问题 在PHP开发中,如果直接将包含Emoji表情的字符串存储到…

    PHP 2023年5月26日
    00
  • php面向对象程序设计

    PHP面向对象程序设计完整使用攻略 PHP面向对象程序设计是一种基于对象的编程范式,它将数据和操作封装在一起,以便于代码的复用和维护。本文将详细讲解PHP面向对象程序设计的使用攻略,包括基本概念、类和对象、继承和多态、接口和抽象类、命名空间和自动加载、异常处理和魔术方法等。 基本概念 在PHP中,面向对象程序设计是基于类和对象的编程范式。类是一种抽象的数据类…

    PHP 2023年5月12日
    00
  • PHP查询分页的实现代码

    当我们需要从数据库中查询大量数据时,需要进行分页处理来避免一次性查询过多的数据,影响网页响应速度。本攻略将详细介绍如何使用PHP实现分页功能。 实现思路 分页功能主要涉及两个参数:当前页码和每页显示的数据条数。通过这两个参数,结合数据库中数据的总数,计算出总页数。然后根据当前页码查询数据库中对应页码的数据,并进行渲染。 准备工作 数据库中存储的数据表,例如名…

    PHP 2023年5月23日
    00
  • Thinkphp微信公众号支付接口

    请看下面的”ThinkPHP微信公众号支付接口完整攻略”: 1. 前言 微信公众号支付,是指用户在微信公众号中完成整个支付的过程,微信公众号支付的好处是用户不需要离开微信的环境就可以完成支付,使用户跨入购买行动的门槛更低,也使商家更方便地与用户进行交互。 本攻略主要介绍如何在 ThinkPHP 框架中,快速使用微信公众号支付接口。 2. 准备工作 首先,我们…

    PHP 2023年5月23日
    00
  • JSON用法之将PHP数组转JS数组,JS如何接收PHP数组

    将PHP数组转JS数组主要是为了在客户端使用JavaScript操作这些数据,一般使用JSON将PHP数组序列化,并将序列化后的结果传递到客户端,客户端通过JSON.parse()方法解析JSON数据,进而获得PHP数组转换后的JS数组。 以下是详细步骤和示例说明: 1. PHP数组转JSON 在PHP中,使用json_encode()函数将PHP数组转为J…

    PHP 2023年5月26日
    00
  • PHP的几个常用数字判断函数代码

    下面详细讲解PHP的几个常用数字判断函数代码的完整攻略。 函数介绍 在PHP中,有几个数字判断函数可以方便地帮助我们对数字进行判断,通常使用如下几个函数: is_numeric():用于判断变量是否为数字或者数字字符串,如果是返回 true,否则返回 false。 is_int():用于判断一个变量是否为整数类型,是返回 true,否则返回 false。 i…

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