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
PHP生成静态页面详解
Dec 05 PHP
php-accelerator网站加速PHP缓冲的方法
Jul 30 PHP
php 提速工具eAccelerator 配置参数详解
May 16 PHP
PHP程序级守护进程的实现与优化的使用概述
May 02 PHP
php自动给网址加上链接的方法
Jun 02 PHP
PHP实现的简单网络硬盘
Jul 29 PHP
文件上传之SWFUpload插件(代码)
Jul 30 PHP
Zend Framework路由器用法实例详解
Dec 11 PHP
yii2.0整合阿里云oss删除单个文件的方法
Sep 19 PHP
php写入txt乱码的解决方法
Sep 17 PHP
laravel实现前后台路由分离的方法
Oct 13 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脚本数据库功能详解(上)
2006/10/09 PHP
excellent!――ASCII Art(由目标图象生成ascii)
2007/02/20 PHP
用mysql内存表来代替php session的类
2009/02/01 PHP
PHP获取当前完整URL地址的函数
2014/12/21 PHP
php实现专业获取网站SEO信息类实例
2015/04/02 PHP
php实现微信支付之现金红包
2018/05/30 PHP
firefo xml 读写实现js代码
2009/06/11 Javascript
JQuery 选择器 xpath 语法应用
2010/05/13 Javascript
JavaScript高级程序设计 读书笔记之十一 内置对象Global
2012/03/07 Javascript
JS跨域代码片段
2012/08/30 Javascript
原生Js实现元素渐隐/渐现(原理为修改元素的css透明度)
2013/06/24 Javascript
jQuery响应enter键的实现思路
2014/04/18 Javascript
IE浏览器IFrame对象内存不释放问题解决方法
2014/08/22 Javascript
JavaScript实现文字与图片拖拽效果的方法
2015/02/16 Javascript
关于angularJs指令的Scope(作用域)介绍
2016/10/25 Javascript
js实现省份下拉菜单效果
2017/02/15 Javascript
JavaScript设计模式之策略模式详解
2017/06/09 Javascript
ES6 Object方法扩展的应用实例分析
2019/06/25 Javascript
vue中监听路由参数的变化及方法
2019/12/06 Javascript
python代码检查工具pylint 让你的python更规范
2012/09/05 Python
在Python程序中进行文件读取和写入操作的教程
2015/04/28 Python
python list是否包含另一个list所有元素的实例
2018/05/04 Python
分析python请求数据
2018/08/19 Python
python3通过selenium爬虫获取到dj商品的实例代码
2019/04/25 Python
如何通过50行Python代码获取公众号全部文章
2019/07/12 Python
python基于json文件实现的gearman任务自动重启代码实例
2019/08/13 Python
解决IDEA 的 plugins 搜不到任何的插件问题
2020/05/04 Python
HTML5的自定义属性data-*详细介绍和JS操作实例
2014/04/10 HTML / CSS
西班牙网上书店:Casa del Libro
2016/11/01 全球购物
Java servlet面试题
2012/03/04 面试题
社区学习十八大感想
2014/01/22 职场文书
教师自荐信范文
2015/03/06 职场文书
2015政治思想表现评语
2015/03/25 职场文书
简短的36句中秋节祝福信息语句
2019/09/09 职场文书
曾国藩励志经典名言37句,蕴含哲理
2019/10/14 职场文书
Python 统计序列中元素的出现频度
2022/04/26 Python