PHP实现求解最长公共子串问题的方法

 更新时间:2017年11月17日 10:06:49   作者:朱__朱  
这篇文章主要介绍了PHP实现求解最长公共子串问题的方法,简单描述了求解最长公共子串问题算法原理,并结合实例形式分析了PHP实现求解最长公共子串的具体操作技巧,需要的朋友可以参考下

本文实例讲述了PHP实现求解最长公共子串问题的方法。分享给大家供大家参考,具体如下:

题目:如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串二中,则字符串一称之为字符串二的子串。

注意,并不要求子串(字符串一)的字符必须连续出现在字符串二中。即,可以不连续,但顺序不能变。

请编写一个函数,输入两个字符串,求它们的最长公共子串,并打印出一个最长公共子串。

例如:输入两个字符串BDCABA和ABCBDAB,字符串BCBA和BDAB都是是它们的最长公共子串,

下面的算法是根据网上的java算法由酒逍遥 翻译过来的

已经经过修正

LCS经典算法php版本

<?php
class LCS{
  public static function main(){
    //设置字符串长度
    $substringLength1 = 20;
    $substringLength2 = 20; //具体大小可自行设置
    $opt=array_fill(0,21,array_fill(0,21,null));
    // 随机生成字符串
    $x = self::GetRandomStrings($substringLength1);
    $y = self::GetRandomStrings($substringLength2);
    $startTime = microtime(true);
    // 动态规划计算所有子问题
    for ($i = $substringLength1 - 1; $i >= 0; $i--){
      for ($j = $substringLength2 - 1; $j >= 0; $j--){
        if ($x[$i] == $y[$j])
          $opt[$i][$j] = $opt[$i + 1][$j + 1] + 1;
        else
          $opt[$i][$j] = max($opt[$i + 1][$j], $opt[$i][$j + 1]);
      }
    }
    echo "substring1:".$x."\r\n";
    echo "substring2:".$y."\r\n";
    echo "LCS:";
    $i = 0;
    $j = 0;
    while ($i < $substringLength1 && $j < $substringLength2){
      if ($x[$i] == $y[$j]){
        echo $x[$i];
        $i++;
        $j++;
      } else if ($opt[$i + 1][$j] >= $opt[$i][$j + 1])
        $i++;
      else
        $j++;
    }
    $endTime = microtime(true);
    echo "\r\n";
    echo "Totle time is " . ($endTime - $startTime) . " s";
  }
  public static function GetRandomStrings($length){
    $buffer = "abcdefghijklmnopqrstuvwxyz";
    $str="";
    for($i=0;$i<$length;$i++){
      $random=rand(0,strlen($buffer)-1);
      $str.=$buffer[$random];
    }
    return $str;
  }
}
LCS::main();
?>

运行结果:

substring1:cgqtdaacneftabsxvmlb
substring2:suwjwwakzzhghbsmnksg
LCS:absm
Totle time is 0.000648975372314 s

更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP数据结构与算法教程》、《php程序设计算法总结》、《php字符串(string)用法总结》、《PHP数组(Array)操作技巧大全》、《PHP常用遍历算法与技巧总结》及《PHP数学运算技巧总结

希望本文所述对大家PHP程序设计有所帮助。

相关文章

  • PHP中用header图片地址 简单隐藏图片源地址

    PHP中用header图片地址 简单隐藏图片源地址

    用header实现图片地址的隐藏
    2008-04-04
  • PHP实现的回溯算法示例

    PHP实现的回溯算法示例

    这篇文章主要介绍了PHP实现的回溯算法,结合具体实例形式分析了php回溯算法的实现步骤与使用方法,涉及字符串与数组的递归、遍历、运算等相关操作技巧,需要的朋友可以参考下
    2017-08-08
  • 在VSCode中配置PHP开发环境的实战步骤

    在VSCode中配置PHP开发环境的实战步骤

    最近要写一些可视化的网站,所以先把需要的环境配好吧,下面这篇文章主要给大家介绍了关于在VSCode中配置PHP开发环境的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-11-11
  • php 使用 __call实现重载功能示例

    php 使用 __call实现重载功能示例

    这篇文章主要介绍了php 使用 __call实现重载功能,结合实例形式分析了PHP使用__call实现重载的相关操作技巧,需要的朋友可以参考下
    2019-11-11
  • PHP 进度条函数的简单实例

    PHP 进度条函数的简单实例

    这篇文章主要介绍了PHP 进度条函数的简单实例的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-09-09
  • PHP中file_get_contents设置header请求头,curl传输选项参数详解说明

    PHP中file_get_contents设置header请求头,curl传输选项参数详解说明

    php中远程获取和采集内容、实现PHP网页版的FTP上传下载、实现模拟登陆、实现接口数据传输(API)、实现模拟Cookie、下载文件断点续传等等,都会用到fopen、file_get_contents和curl这样的函数,当然要对比一下了,程序架构设计当然要无可挑剔了。
    2023-07-07
  • 解析PHP中DIRECTORY_SEPARATOR,PATH_SEPARATOR两个常量的作用

    解析PHP中DIRECTORY_SEPARATOR,PATH_SEPARATOR两个常量的作用

    本篇文章是对PHP中DIRECTORY_SEPARATOR,PATH_SEPARATOR两个常量的作用进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • php数组索引与键值操作技巧实例分析

    php数组索引与键值操作技巧实例分析

    这篇文章主要介绍了php数组索引与键值操作技巧,涉及php数组的遍历与索引、键值操作的相关技巧,需要的朋友可以参考下
    2015-06-06
  • 探究Laravel使用env函数读取环境变量为null的问题

    探究Laravel使用env函数读取环境变量为null的问题

    最近在工作中遇到一个问题,不知道大家有没有遇到过,在 Laravel中(除 app/config 目录下的配置文件中)使用env函数读取环境变量,有时有用,有时返回 null,这究竟怎么回事?下面通过这篇文章让我们一探究竟。有需要的朋友们下面来一起看看吧。
    2016-12-12
  • PHP cdata 处理(详细介绍)

    PHP cdata 处理(详细介绍)

    之前为项目赶进度用php 的simplexml来解析 xml, 当时发现 simplexml不支持<![CDATA标签, 所有处于这个标签内的值都没有办法取到
    2013-07-07

最新评论