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 相关文章推荐
dedecms系统常用术语汇总
Apr 03 PHP
解析link_mysql的php版
Jun 30 PHP
php用正则表达式匹配URL的简单方法
Nov 12 PHP
PHP实现将HTML5中Canvas图像保存到服务器的方法
Nov 28 PHP
php获取QQ头像并显示的方法
Dec 23 PHP
js+php实现静态页面实时调用用户登陆状态的方法
Jan 04 PHP
基于PHP+jQuery+MySql实现红蓝(顶踩)投票代码
Aug 25 PHP
win7安装php框架Yii的方法
Jan 25 PHP
浅析Yii2缓存的使用
May 10 PHP
Yii2 assets清除缓存的方法
May 16 PHP
使用PHPWord生成word文档的方法详解
Jun 06 PHP
php+mysql+ajax 局部刷新点赞/取消点赞功能(每个账号只点赞一次)
Jul 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
备份mysql数据库的php代码(一个表一个文件)
2010/05/28 PHP
php正则过滤html标签、空格、换行符的代码(附说明)
2010/10/25 PHP
php数组中删除元素之重新索引的方法
2014/09/16 PHP
php实现将任意进制数转换成10进制的方法
2015/04/17 PHP
PHP邮件群发机实现代码
2016/02/16 PHP
php监测数据是否成功插入到Mysql数据库的方法
2016/11/25 PHP
CentOS系统中PHP安装扩展的方式汇总
2017/04/09 PHP
javascript英文日期(有时间)选择器
2007/05/02 Javascript
jquery ready函数源代码研究
2009/12/06 Javascript
Wordpress ThickBox 添加“查看原图”效果代码
2010/12/11 Javascript
JS判断字符串长度的5个方法(区分中文和英文)
2014/03/18 Javascript
JavaScript中document对象使用详解
2015/01/06 Javascript
Javascript获取background属性中url的值
2016/10/17 Javascript
jsp 网站引入外部css或者js失效问题解决
2016/10/31 Javascript
写jQuery插件时的注意点
2017/02/20 Javascript
jQuery插件HighCharts绘制2D半圆环图效果示例【附demo源码下载】
2017/03/09 Javascript
JavaScript中错误正确处理方式小结你用对了吗
2017/10/10 Javascript
JS实现获取汉字首字母拼音、全拼音及混拼音的方法
2017/11/14 Javascript
[50:54]完美世界DOTA2联赛 GXR vs IO 第三场 11.07
2020/11/10 DOTA
python人人网登录应用实例
2014/09/26 Python
Python中使用socket发送HTTP请求数据接收不完整问题解决方法
2015/02/04 Python
对python中数组的del,remove,pop区别详解
2018/11/07 Python
python爬虫获取小区经纬度以及结构化地址
2018/12/30 Python
PYQT5实现控制台显示功能的方法
2019/06/25 Python
python2使用bs4爬取腾讯社招过程解析
2019/08/14 Python
Python实现word2Vec model过程解析
2019/12/16 Python
八皇后问题,输出了所有情况,不过有些结果只是旋转了90度
2016/08/15 面试题
初中生学习的自我评价
2013/11/14 职场文书
中学运动会广播稿
2014/01/19 职场文书
列车长先进事迹材料
2014/01/25 职场文书
适用于所有创业者的创业计划书
2014/02/05 职场文书
公共机构节能宣传周活动总结
2014/07/09 职场文书
学校党员对照检查材料
2014/08/28 职场文书
社团个人总结范文
2015/03/05 职场文书
2015个人简历自我评价语
2015/03/11 职场文书
致接力运动员加油稿
2015/07/21 职场文书