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&amp;&amp;mysql)二
Oct 09 PHP
php Sql Server连接失败问题及解决办法
Aug 07 PHP
PHP实现多条件查询实例代码
Jul 17 PHP
几个有用的php字符串过滤,转换函数代码
May 01 PHP
浅析php header 跳转
Jun 17 PHP
ThinkPHP、ZF2、Yaf、Laravel框架路由大比拼
Mar 25 PHP
php关联数组快速排序的方法
Apr 17 PHP
php简单实现发送带附件的邮件
Jun 10 PHP
利用PHP如何实现Socket服务器
Sep 23 PHP
redirect_uri参数错误的解决方法(必看)
Feb 16 PHP
php连接MSsql server的五种方法总结
Mar 04 PHP
Thinkphp 框架扩展之行为扩展原理与实现方法分析
Apr 23 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
dedecms模版制作使用方法
2007/04/03 PHP
解析php中用PHPMailer来发送邮件的示例(126.com的例子)
2013/06/24 PHP
PHP使用file_get_content设置头信息的方法
2016/02/14 PHP
用javascript实现在小方框中浏览大图的代码
2007/08/14 Javascript
javascript中强制执行toString()具体实现
2013/04/27 Javascript
node.js正则表达式获取网页中所有链接的代码实例
2014/06/03 Javascript
详解基于Bootstrap扁平化的后台框架Ace
2015/11/27 Javascript
node.js实现端口转发
2016/04/14 Javascript
如何用js实现鼠标向上滚动时浮动导航
2016/07/18 Javascript
AngularJS指令用法详解
2016/11/02 Javascript
ionic3+Angular4实现接口请求及本地json文件读取示例
2017/10/11 Javascript
vue-cli 如何打包上线的方法示例
2018/05/08 Javascript
React Hooks的深入理解与使用
2018/11/12 Javascript
layui table 列宽百分比显示的实现方法
2019/09/28 Javascript
python使用点操作符访问字典(dict)数据的方法
2015/03/16 Python
Python中的类与对象之描述符详解
2015/03/27 Python
opencv实现图片模糊和锐化操作
2018/11/19 Python
浅谈Python3实现两个矩形的交并比(IoU)
2020/01/18 Python
python给图像加上mask,并提取mask区域实例
2020/01/19 Python
给 TensorFlow 变量进行赋值的方式
2020/02/10 Python
Python中对象的比较操作==和is区别详析
2021/02/12 Python
利用CSS3实现的文字定时向上滚动
2016/08/29 HTML / CSS
CSS3与动画有关的属性transition、animation、transform对比(史上最全版)
2017/08/18 HTML / CSS
墨西哥运动服饰和鞋网上商店:Netshoes墨西哥
2016/07/28 全球购物
全球性的女装店:storets
2019/06/12 全球购物
豪华床上用品、床单和浴室必需品:Peacock Alley
2019/09/04 全球购物
英国家具、照明、家居用品网上商店:Wayfair.co.uk
2020/02/13 全球购物
经典c++面试题六
2012/01/18 面试题
百年校庆节目主持词
2014/03/27 职场文书
食品采购员岗位职责
2014/04/14 职场文书
2014年学雷锋活动总结
2014/06/26 职场文书
学生会竞选演讲稿纪检部
2014/08/25 职场文书
群众路线领导干部个人对照检查材料(集锦)
2014/09/23 职场文书
信访工作汇报材料
2014/10/27 职场文书
城管个人总结
2015/02/28 职场文书
学生病假条怎么写
2015/08/17 职场文书