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下用cookie统计用户访问网页次数的代码
May 09 PHP
smarty模板嵌套之include与fetch性能测试
Dec 05 PHP
PHP下打开phpMyAdmin出现403错误的问题解决方法
May 23 PHP
详解PHP中的null合并运算符
Dec 30 PHP
示例详解Laravel重置密码代码重构
Aug 10 PHP
简单谈谈 php 文件锁
Feb 19 PHP
php封装一个异常的处理类
Jun 08 PHP
PHP 访问数据库配置通用方法(json)
May 20 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
Jun 16 PHP
php的优点总结 php有哪些优点
Jul 19 PHP
PHP 图片合成、仿微信群头像的方法示例
Oct 25 PHP
php ZipArchive实现多文件打包下载实例
Oct 31 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.ini 中文版
2006/10/28 PHP
微信公众平台开发关注及取消关注事件的方法
2014/12/23 PHP
合格的PHP程序员必备技能
2015/11/13 PHP
Zend Framework入门之环境配置及第一个Hello World示例(附demo源码下载)
2016/03/21 PHP
php版交通银行网银支付接口开发入门教程
2016/09/26 PHP
分享一个我自己写的ToolTip提示插件(附源码)
2013/01/20 Javascript
js从10种颜色中随机取色实现每次取出不同的颜色
2013/10/23 Javascript
js实现全屏漂浮广告移入光标停止移动
2013/12/02 Javascript
fmt:formatDate的输出格式详解
2014/01/09 Javascript
JavaScript中跨域调用Flash的方法
2014/08/11 Javascript
AngularJS入门(用ng-repeat指令实现循环输出
2016/05/05 Javascript
AngularJS 单元测试(二)详解
2016/09/21 Javascript
详解网站中图片日常使用以及优化手法
2017/01/09 Javascript
通俗解释JavaScript正则表达式快速记忆
2017/08/23 Javascript
vue watch关于对象内的属性监听
2019/04/22 Javascript
React优化子组件render的使用
2019/05/12 Javascript
微信小程序云开发实现增删改查功能
2019/05/17 Javascript
[34:39]Secret vs VG 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
Python AES加密模块用法分析
2017/05/22 Python
python实现上传下载文件功能
2020/11/19 Python
Python制作豆瓣图片的爬虫
2017/12/28 Python
python 和c++实现旋转矩阵到欧拉角的变换方式
2019/12/04 Python
python 实现生成均匀分布的点
2019/12/05 Python
python应用Axes3D绘图(批量梯度下降算法)
2020/03/25 Python
翻转数列python实现,求前n项和,并能输出整个数列的案例
2020/05/03 Python
Python实现打包成库供别的模块调用
2020/07/13 Python
爬虫代理的cookie如何生成运行
2020/09/22 Python
英国二手iPhone、音乐、电影和游戏商店:musicMagpie
2018/10/26 全球购物
夜大毕业生自我鉴定
2013/10/31 职场文书
物业管理毕业生的自我评价
2014/02/17 职场文书
《青蛙看海》教学反思
2014/04/23 职场文书
优秀学生干部事迹材料
2014/12/24 职场文书
小学教研工作总结2015
2015/05/13 职场文书
小学开学典礼新闻稿
2015/07/17 职场文书
Go语言带缓冲的通道实现
2021/04/26 Golang
MySQL数据库优化之通过索引解决SQL性能问题
2022/04/10 MySQL