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 相关文章推荐
一个更简单的无限级分类菜单代码
Jan 16 PHP
实用函数10
Nov 08 PHP
php下intval()和(int)转换使用与区别
Jul 18 PHP
php 动态执行带有参数的类方法
Apr 10 PHP
PHP 写文本日志实现代码
May 18 PHP
php SQL Injection with MySQL
Feb 27 PHP
php cookies中删除的一般赋值方法
May 07 PHP
PHP导出EXCEL快速开发指南--PHPEXCEL的使用详解
Jun 03 PHP
php取整函数ceil,floo,round的用法及介绍
Aug 31 PHP
PHP中auto_prepend_file与auto_append_file用法实例分析
Sep 22 PHP
php获取flash尺寸详细数据的方法
Nov 12 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
PHPExcel读取Excel文件的实现代码
2011/12/06 PHP
PHP实现的博客欢迎提示功能(很特别哦)
2014/06/05 PHP
php文件缓存类用法实例分析
2015/04/22 PHP
PHP实现求两个字符串最长公共子串的方法示例
2017/11/17 PHP
PHPExcel 修改已存在Excel的方法
2018/05/03 PHP
laravel 解决Validator使用中出现的问题
2019/10/25 PHP
用js实现的一个Flash滚动轮换显示图片代码生成器
2007/03/14 Javascript
番茄的表单验证类代码修改版
2008/07/18 Javascript
jquery动态调整div大小使其宽度始终为浏览器宽度
2014/06/06 Javascript
jquery选择器需要注意的问题
2014/11/26 Javascript
jquery实现可拖拽弹出层特效
2015/01/04 Javascript
JS实现图片平面旋转的方法
2016/03/01 Javascript
switch语句的妙用(必看篇)
2016/10/03 Javascript
javascript之with的使用(阿里云、淘宝使用代码分析)
2016/10/11 Javascript
基于node.js express mvc轻量级框架实践
2017/09/14 Javascript
vue中vee validate表单校验的几种基本使用
2018/06/25 Javascript
Vue+axios实现统一接口管理的方法
2018/07/23 Javascript
Node.js系列之安装配置与基本使用(1)
2019/08/30 Javascript
jQuery实现电梯导航模块
2020/12/22 jQuery
Python基于递归和非递归算法求两个数最大公约数、最小公倍数示例
2018/05/21 Python
Python带动态参数功能的sqlite工具类
2018/05/26 Python
Python将一个CSV文件里的数据追加到另一个CSV文件的方法
2018/07/04 Python
matplotlib jupyter notebook 图像可视化 plt show操作
2020/04/24 Python
Pyecharts地图显示不完成问题解决方案
2020/05/11 Python
Timberland澳大利亚官网:全球领先的户外品牌
2019/12/10 全球购物
C#基础面试题
2016/10/17 面试题
工作时间上网检讨书
2014/02/03 职场文书
个人工作表现评语
2014/04/30 职场文书
文案策划专业自荐信
2014/07/07 职场文书
大学生党员学习焦裕禄精神思想汇报
2014/09/10 职场文书
社会体育专业大学生职业生涯规划书
2014/09/17 职场文书
学校拾金不昧表扬信
2015/01/16 职场文书
应聘教师求职信范文
2015/03/20 职场文书
2015年团支部年度工作总结
2015/05/27 职场文书
Java9新特性之Module模块化编程示例演绎
2022/03/16 Java/Android
特别篇动画《总之就是非常可爱 ~制服~》PV公开,2022年夏季播出
2022/04/04 日漫