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


Posted in PHP onNovember 17, 2017

本文实例讲述了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捕获Fatal error错误的方法
Jun 11 PHP
PHP命名空间(namespace)的使用基础及示例
Aug 18 PHP
Laravel框架路由配置总结、设置技巧大全
Sep 03 PHP
PHP_SELF,SCRIPT_NAME,REQUEST_URI区别
Dec 24 PHP
php基于PDO连接MSSQL示例DEMO
Jul 13 PHP
php版微信发红包接口用法示例
Sep 23 PHP
php登录超时检测功能实例详解
Mar 21 PHP
用PHP去掉文件头的Unicode签名(BOM)方法
Jun 22 PHP
php利用云片网实现短信验证码功能的示例代码
Nov 18 PHP
PHP使用glob方法遍历文件夹下所有文件的实例
Oct 17 PHP
Windows服务器中PHP如何安装redis扩展
Sep 27 PHP
解决windows上php xdebug 无法调试的问题
Feb 19 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
Nov 17 #PHP
PHP 实现人民币小写转换成大写的方法及大小写转换函数
Nov 17 #PHP
关于php支持的协议与封装协议总结(推荐)
Nov 17 #PHP
PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】
Nov 16 #PHP
PHP实现链式操作的三种方法详解
Nov 16 #PHP
thinkphp5.0自定义验证规则使用方法
Nov 16 #PHP
PHP实现验证码校验功能
Nov 16 #PHP
You might like
一个简单的自动发送邮件系统(二)
2006/10/09 PHP
PHP和.net中des加解密的实现方法
2013/02/27 PHP
JavaScript与函数式编程解释
2007/04/27 Javascript
海量经典的jQuery插件集合
2010/01/12 Javascript
myeclipse安装jQuery插件的方法
2011/03/29 Javascript
onclick与listeners的执行先后问题详细解剖
2013/01/07 Javascript
jquery的flexigrid无法显示数据提示获取到数据
2013/07/19 Javascript
扩展JS Date对象时间格式化功能的小例子
2013/12/02 Javascript
js简单抽奖代码
2015/01/16 Javascript
JavaScript中的toLocaleDateString()方法使用简介
2015/06/12 Javascript
详解jquery事件delegate()的使用方法
2016/01/25 Javascript
详解JavaScript对象类型
2016/06/16 Javascript
jQuery实现拖动剪裁图片作为头像
2016/12/28 Javascript
详解nuxt路由鉴权(express模板)
2018/11/21 Javascript
Angular8 简单表单验证的实现示例
2020/06/03 Javascript
Django使用Celery异步任务队列的使用
2018/03/13 Python
浅谈Series和DataFrame中的sort_index方法
2018/06/07 Python
python Pandas如何对数据集随机抽样
2019/07/29 Python
python快速排序的实现及运行时间比较
2019/11/22 Python
python输出pdf文档的实例
2020/02/13 Python
使用Pycharm(Python工具)新建项目及创建Python文件的教程
2020/04/26 Python
Python3 ffmpeg视频转换工具使用方法解析
2020/08/10 Python
python 实现非极大值抑制算法(Non-maximum suppression, NMS)
2020/10/15 Python
安装Anaconda3及使用Jupyter的方法
2020/10/27 Python
Django contrib auth authenticate函数源码解析
2020/11/12 Python
Python实现图片指定位置加图片水印(附Pyinstaller打包exe)
2021/03/04 Python
Java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类
2012/02/06 面试题
计算机专业大学生的自我评价
2013/11/14 职场文书
优秀演讲稿范文
2013/12/29 职场文书
个人授权委托书
2014/04/03 职场文书
竞聘上岗演讲稿
2014/05/16 职场文书
带刀到教室的检讨书
2014/10/04 职场文书
自荐信格式范文
2015/03/04 职场文书
2015年社区党务工作总结
2015/04/21 职场文书
幼儿园保育员随笔
2015/08/14 职场文书
检讨书范文
2019/04/16 职场文书