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和ACCESS写聊天室(五)
Oct 09 PHP
PHP表单提交表单名称含有点号(.)则会被转化为下划线(_)
Dec 14 PHP
深入mysql_fetch_row()与mysql_fetch_array()的区别详解
Jun 05 PHP
php输出1000以内质数(素数)示例
Feb 16 PHP
php数组去重复数据示例
Feb 25 PHP
php基本函数汇总
Jul 09 PHP
PHP常用设计模式之委托设计模式
Feb 13 PHP
PHP实现导出带样式的Excel
Aug 28 PHP
浅谈PHP命令执行php文件需要注意的问题
Dec 16 PHP
详解使用php调用微信接口上传永久素材
Apr 11 PHP
使用PHP+MySql+Ajax+jQuery实现省市区三级联动功能示例
Sep 15 PHP
php无限级分类实现评论及回复功能
Feb 18 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中计算时间差的几种方法
2009/12/31 PHP
php的list()的一步操作给一组变量进行赋值的使用
2011/05/18 PHP
php从数组中随机抽取一些元素的代码
2012/11/05 PHP
Yii开启片段缓存的方法
2016/03/28 PHP
php array_values 返回数组的值实例详解
2016/11/17 PHP
PHP简单获取随机数的常用方法小结
2017/06/07 PHP
JS实现淘宝幻灯片效果的实现方法
2013/03/22 Javascript
js toFixed()方法的重写实现精度的统一
2014/03/06 Javascript
javascript 获取浏览器版本
2015/01/21 Javascript
JS实现的简单拖拽功能示例
2017/03/13 Javascript
详解在express站点中使用ejs模板引擎
2017/09/21 Javascript
Angular实现的简单定时器功能示例
2017/12/28 Javascript
express如何使用session与cookie的方法
2018/01/30 Javascript
vue实现a标签点击高亮方法
2018/03/17 Javascript
js构建二叉树进行数值数组的去重与优化详解
2018/03/26 Javascript
Vue 动态设置路由参数的案例分析
2018/04/24 Javascript
AngularJS实现与后台服务器进行交互的示例讲解
2018/08/13 Javascript
ES6 fetch函数与后台交互实现
2018/11/14 Javascript
详解js动态获取浏览器或页面等容器的宽高
2019/03/13 Javascript
vux-scroller实现移动端上拉加载功能过程解析
2019/10/08 Javascript
JS实现烟花爆炸效果
2020/03/10 Javascript
[45:44]完美世界DOTA2联赛PWL S2 FTD vs PXG 第一场 11.27
2020/12/01 DOTA
使用Python编写一个模仿CPU工作的程序
2015/04/16 Python
python 3.5下xadmin的使用及修复源码bug
2017/05/10 Python
Python有序查找算法之二分法实例分析
2017/12/11 Python
numpy使用技巧之数组过滤实例代码
2018/02/03 Python
解决pandas .to_excel不覆盖已有sheet的问题
2018/12/10 Python
win10系统Anaconda和Pycharm的Tensorflow2.0之CPU和GPU版本安装教程
2019/12/03 Python
对python中 math模块下 atan 和 atan2的区别详解
2020/01/17 Python
在django admin详情表单显示中添加自定义控件的实现
2020/03/11 Python
jupyter使用自动补全和切换默认浏览器的方法
2020/11/18 Python
localStorage的过期时间设置的方法详解
2018/11/26 HTML / CSS
html5唤醒APP小记
2019/03/27 HTML / CSS
澳大利亚在线购买葡萄酒:The Wine Collective
2020/02/20 全球购物
经销商会议开幕词
2016/03/04 职场文书
JS函数式编程实现XDM一
2022/06/16 Javascript