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 相关文章推荐
打造计数器DIY三步曲(中)
Oct 09 PHP
允许phpmyadmin空密码登录的配置方法
May 29 PHP
phpmyadmin config.inc.php配置示例
Aug 27 PHP
php preg_replace替换实例讲解
Nov 04 PHP
php对数组排序的简单实例
Dec 25 PHP
async和DOM Script文件加载比较
Jul 20 PHP
安装ImageMagick出现error while loading shared libraries的解决方法
Sep 23 PHP
Java和PHP在Web开发方面对比分析
Mar 01 PHP
Yii使用技巧大汇总
Dec 29 PHP
PHP中addslashes()和stripslashes()实现字符串转义和还原用法实例
Jan 07 PHP
汇总PHPmailer群发Gmail的常见问题
Feb 24 PHP
PHP连接SQL server数据库测试脚本运行实例
Aug 24 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
阿里云Win2016安装Apache和PHP环境图文教程
2018/03/11 PHP
CodeIgniter框架钩子机制实现方法【hooks类】
2018/08/21 PHP
基于php伪静态的实现方法解析
2020/07/31 PHP
php实现图片压缩处理
2020/09/09 PHP
js变量作用域及可访问性的探讨
2006/11/23 Javascript
jquery 学习笔记 传智博客佟老师附详细注释
2020/09/12 Javascript
jQuery .tmpl(), .template()学习资料小结
2011/07/18 Javascript
jQuery中:checked选择器用法实例
2015/01/04 Javascript
封装好的一个万能检测表单的方法
2015/01/21 Javascript
ztree获取选中节点时不能进入可视区域出现BUG如何解决
2015/12/03 Javascript
使用struts2+Ajax+jquery验证用户名是否已被注册
2016/03/22 Javascript
node.js文件上传处理示例
2016/10/27 Javascript
Angular 开发学习之Angular CLI的安装使用
2017/12/31 Javascript
Javascript将图片的绝对路径转换为base64编码的方法
2018/01/11 Javascript
vue.js2.0点击获取自己的属性和jquery方法
2018/02/23 jQuery
JS装饰器函数用法总结
2018/04/21 Javascript
JavaScript Math对象和调试程序的方法分析
2019/05/13 Javascript
Vue 前端实现登陆拦截及axios 拦截器的使用
2019/07/17 Javascript
小程序实现日历左右滑动效果
2019/10/21 Javascript
Node.js API详解之 readline模块用法详解
2020/05/22 Javascript
vue实现打地鼠小游戏
2020/08/21 Javascript
[01:05:12]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS CIS-GAME
2014/05/21 DOTA
[07:40]DOTA2每周TOP10 精彩击杀集锦vol.4
2014/06/25 DOTA
OpenCV里的imshow()和Matplotlib.pyplot的imshow()的实现
2019/11/25 Python
详解Python中字符串前“b”,“r”,“u”,“f”的作用
2019/12/18 Python
C语言开发工程师测试题
2016/12/20 面试题
托管代码(Managed Code)和非托管代码(Unmanaged Code)有什么区别
2014/09/29 面试题
市场营销专业个人求职信范文
2013/12/14 职场文书
低碳环保倡议书
2014/04/14 职场文书
2014审计局领导班子民主生活会对照检查材料思想汇报
2014/09/20 职场文书
2014年幼儿园园务工作总结
2014/12/05 职场文书
学生自我评语
2015/01/04 职场文书
介绍信样本
2015/01/31 职场文书
财务总监岗位职责范本
2015/04/03 职场文书
学习党章心得体会2016
2016/01/15 职场文书
python爬取企查查企业信息之selenium自动模拟登录企查查
2021/04/08 Python