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 相关文章推荐
2.PHP入门
Oct 09 PHP
PHP中将数组转成XML格式的实现代码
Aug 08 PHP
解析php常用image图像函数集
Jun 24 PHP
PHP中的按位与和按位或操作示例
Jan 27 PHP
PHP常用技术文之文件操作和目录操作总结
Sep 27 PHP
php实现插入排序
Mar 29 PHP
PHP网络操作函数汇总
May 18 PHP
php生成数字字母的验证码图片
Jul 14 PHP
PHP代码实现表单数据验证类
Jul 28 PHP
PHP常用字符串函数小结(推荐)
Aug 05 PHP
PHP中十六进制颜色与RGB颜色值互转的方法
Mar 18 PHP
PHP基于进程控制函数实现多线程
Dec 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实现与ASP Banner组件相似的类
2006/10/09 PHP
PHPwind整合最土系统用户同步登录实现方法
2010/12/08 PHP
php中jpgraph类库的使用介绍
2013/08/08 PHP
php求一个网段开始与结束IP地址的方法
2015/07/09 PHP
php+redis实现商城秒杀功能
2020/11/19 PHP
关于JavaScript的with 语句的使用方法
2011/05/09 Javascript
javascript实现在线客服效果
2015/07/15 Javascript
js中跨域方法原理详解
2015/07/19 Javascript
js实现商品抛物线加入购物车特效
2020/11/18 Javascript
JS JSOP跨域请求实例详解
2016/07/04 Javascript
将json转换成struts参数的方法
2016/11/08 Javascript
jquery 多个radio的click事件实例
2016/12/03 Javascript
js选项卡的制作方法
2017/01/23 Javascript
Bootstrap入门教程一Hello Bootstrap初识
2017/03/02 Javascript
JS异步加载的三种实现方式
2017/03/16 Javascript
微信小程序 支付功能实现PHP实例详解
2017/05/12 Javascript
iscroll实现下拉刷新功能
2017/07/18 Javascript
vue 粒子特效的示例代码
2017/09/19 Javascript
使用async、enterproxy控制并发数量的方法详解
2018/01/02 Javascript
微信小程序实时聊天WebSocket
2018/07/05 Javascript
antd-mobile ListView长列表的数据更新遇到的坑
2020/04/08 Javascript
echarts 使用formatter 修改鼠标悬浮事件信息操作
2020/07/20 Javascript
在Python中使用next()方法操作文件的教程
2015/05/24 Python
Python的Asyncore异步Socket模块及实现端口转发的例子
2016/06/14 Python
Python爬虫文件下载图文教程
2018/12/23 Python
python时间与Unix时间戳相互转换方法详解
2020/02/13 Python
python GUI库图形界面开发之PyQt5表格控件QTableView详细使用方法与实例
2020/03/01 Python
如何在Shell脚本中使用函数
2015/09/06 面试题
应届生会计电算化求职信
2013/10/03 职场文书
宿舍保安职务说明书
2014/02/25 职场文书
项目合作协议书
2014/04/16 职场文书
中学生民族团结演讲稿
2014/08/27 职场文书
高一学年自我鉴定范文(3篇)
2014/09/26 职场文书
个人查摆剖析材料
2014/10/16 职场文书
信访工作汇报材料
2014/10/27 职场文书
学术会议领导致辞
2015/07/29 职场文书