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扩展图文教程
Dec 12 PHP
PHP 木马攻击防御技巧
Jun 13 PHP
php中使用explode查找某个字符是否存在的方法
Jul 12 PHP
php set_time_limit()函数的使用详解
Jun 05 PHP
codeigniter自带数据库类使用方法说明
Mar 25 PHP
DEDECMS首页调用图片集里的多张图片
Jun 05 PHP
php中文验证码实现方法
Jun 18 PHP
浅谈PHP eval()函数定义和用法
Jun 21 PHP
Yii中的relations数据关联查询及统计功能用法详解
Jul 14 PHP
PHP实现的获取文件mimes类型工具类示例
Apr 08 PHP
laravel框架实现后台登录、退出功能示例
Oct 31 PHP
PHP设计模式概论【概念、分类、原则等】
May 01 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
windows中为php安装mongodb与memcache
2015/01/06 PHP
yii2 resetful 授权验证详解
2017/05/18 PHP
php类自动装载、链式操作、魔术方法实现代码
2017/07/23 PHP
PHP5.6读写excel表格文件操作示例
2019/02/26 PHP
php使用curl伪造浏览器访问操作示例
2019/09/30 PHP
[JS]点出统计器
2020/10/11 Javascript
jQuery弹出(alert)select选择的值
2013/04/21 Javascript
js拖动div 当鼠标移动时整个div也相应的移动
2013/11/21 Javascript
js获取当前路径的简单示例代码
2014/01/08 Javascript
JavaScript函数参数使用带参数名的方式赋值传入的方法
2015/03/19 Javascript
JavaScript获取ul中li个数的方法
2017/02/13 Javascript
纯JS实现只能输入数字的简单代码
2017/06/21 Javascript
基于js粘贴事件paste简单解析以及遇到的坑
2017/09/07 Javascript
微信禁止下拉查看URL的处理方法
2017/09/28 Javascript
vue项目中导入swiper插件的方法
2018/01/30 Javascript
koa-router源码学习小结
2018/09/07 Javascript
js中int和string数据类型互相转化实例
2019/01/16 Javascript
JavaScript中的回调函数实例讲解
2019/01/27 Javascript
JavaScript定时器常见用法实例分析
2019/11/15 Javascript
Node在Controller层进行数据校验的过程详解
2020/08/28 Javascript
JS实现多功能计算器
2020/10/28 Javascript
ubuntu中配置pyqt4环境教程
2017/12/27 Python
Python 实现异步调用函数的示例讲解
2018/10/14 Python
python里反向传播算法详解
2020/11/22 Python
CSS3中Animation动画属性用法详解
2016/07/04 HTML / CSS
幼儿园教师培训制度
2014/01/16 职场文书
春节活动策划方案
2014/01/24 职场文书
亮化工程实施方案
2014/03/17 职场文书
内勤主管岗位职责
2014/04/03 职场文书
公司离职证明范本(汇总)
2014/09/10 职场文书
初中作文评语集锦
2014/12/25 职场文书
博士论文答辩开场白
2015/06/01 职场文书
永远是春天观后感
2015/06/12 职场文书
家长会后的感想
2015/08/11 职场文书
你对自己的信用报告有过了解吗?
2019/07/09 职场文书
html5调用摄像头截图功能
2022/01/18 Javascript