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 缓存实现代码及详细注释
May 16 PHP
PHP的变量总结 新手推荐
Apr 18 PHP
简单的PHP缓存设计实现代码
Sep 30 PHP
使用PHP计算两个路径的相对路径
Jun 14 PHP
使用PHP会话(Session)实现用户登陆功能
Jun 29 PHP
PHP文件缓存类示例分享
Jan 30 PHP
php简单实现MVC
Feb 05 PHP
PHP实现懒加载的方法
Mar 07 PHP
Symfony2联合查询实现方法
Mar 18 PHP
PHP new static 和 new self详解
Feb 19 PHP
Laravel5.5新特性之友好报错以及展示详解
Aug 13 PHP
PHP完全二叉树定义与实现方法示例
Oct 09 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
PHP中在数据库中保存Checkbox数据(2)
2006/10/09 PHP
php输出金字塔的2种实现方法
2014/12/16 PHP
IE JS无提示关闭窗口不提示的方法
2010/04/29 Javascript
JavaScript基础篇之变量作用域、传值、传址的简单介绍与实例
2013/06/29 Javascript
js跨域访问示例(客户端/服务端)
2014/05/19 Javascript
基于jquery实现发送文章到手机的代码
2014/12/26 Javascript
JavaScript中的包装对象介绍
2015/01/27 Javascript
常用DOM整理
2015/06/16 Javascript
利用JavaScript的AngularJS库制作电子名片的方法
2015/06/18 Javascript
详解Jquery实现ready和bind事件
2016/04/14 Javascript
Node.js+Express配置入门教程
2016/05/19 Javascript
js实现tab切换效果
2017/02/16 Javascript
Angular.JS去掉访问路径URL中的#号详解
2017/03/30 Javascript
jquery自定义显示消息数量
2017/12/19 jQuery
vue-cli脚手架的安装教程图解
2018/09/02 Javascript
Vue-Cli 3.0 中配置高德地图的两种方式
2019/06/19 Javascript
微信小程序制作扭蛋机代码实例
2019/09/24 Javascript
js实现上下左右键盘控制div移动
2020/01/16 Javascript
Javascript模拟实现new原理解析
2020/03/03 Javascript
Vue使用路由钩子拦截器beforeEach和afterEach监听路由
2020/11/16 Javascript
Python中subprocess模块用法实例详解
2015/05/20 Python
用Pygal绘制直方图代码示例
2017/12/07 Python
Python将字典转换为XML的方法
2020/08/01 Python
python中逻辑与或(and、or)和按位与或异或(&amp;、|、^)区别
2020/08/05 Python
HTML5 progress和meter控件_动力节点Java学院整理
2017/07/06 HTML / CSS
打造经典复古风格的品牌:Alice + Olivia(爱丽丝+奥利维亚)
2016/09/07 全球购物
美国最大的宠物药店:1-800-PetMeds
2016/10/02 全球购物
印尼太阳百货公司网站:Matahari
2018/02/04 全球购物
荟萃全球保健品:维他购
2018/05/09 全球购物
《音乐之都维也纳》教学反思
2014/04/16 职场文书
《微笑着面对生活》优秀演讲稿范文
2014/09/23 职场文书
教学改革问题查摆整改措施
2014/09/27 职场文书
上班迟到检讨书300字
2014/10/18 职场文书
农村党支部承诺书
2015/04/30 职场文书
http通过StreamingHttpResponse完成连续的数据传输长链接方式
2022/02/12 Python
MySQL读取JSON转换的方式
2022/03/18 MySQL