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 4.2书写安全的脚本
Oct 09 PHP
PHP开启gzip页面压缩实例代码
Mar 11 PHP
PHP中文URL编解码(urlencode()rawurlencode()
Jul 03 PHP
php 不使用js实现页面跳转
Feb 11 PHP
php的sso单点登录实现方法
Jan 08 PHP
初识ThinkPHP控制器
Apr 07 PHP
yii2中结合gridview如何使用modal弹窗实例代码详解
Jun 12 PHP
laravel创建类似ThinPHP中functions.php的全局函数
Nov 26 PHP
使用PHPMailer发送邮件实例
Feb 15 PHP
Mac系统完美安装PHP7详细教程
Jun 06 PHP
PHP单例模式实例分析【防继承,防克隆操作】
May 22 PHP
layui数据表格自定义每页条数limit设置
Oct 26 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
全国FM电台频率大全 - 8 黑龙江省
2020/03/11 无线电
PHPMailer的主要功能特点和简单使用说明
2014/02/17 PHP
WordPress中重置文章循环的rewind_posts()函数讲解
2016/01/11 PHP
PHP 中使用explode()函数切割字符串为数组的示例
2017/05/06 PHP
PHP实现的多进程控制demo示例
2019/07/22 PHP
ThinkPHP5+UEditor图片上传到阿里云对象存储OSS功能示例
2019/08/05 PHP
Javascript load Page,load css,load js实现代码
2010/03/31 Javascript
基于jquery的一个简单的脚本验证插件
2010/04/05 Javascript
js模仿jquery的写法示例代码
2013/06/16 Javascript
一个奇葩的最短的 IE 版本判断JS脚本
2014/05/28 Javascript
Jquery仿IGoogle实现可拖动窗口示例代码
2014/08/22 Javascript
深入解析JavaScript编程中的this关键字使用
2015/11/09 Javascript
利用JS生成博文目录及CSS定制博客
2016/02/10 Javascript
JavaScript判断是否是微信浏览器
2016/06/13 Javascript
jQuery实现的checkbox级联选择下拉菜单效果示例
2016/12/26 Javascript
一种angular的方法级的缓存注解(装饰器)
2018/03/13 Javascript
vue实现添加与删除图书功能
2018/10/07 Javascript
在vue使用clipboard.js进行一键复制文本的实现示例
2019/01/15 Javascript
vue实现前台列表数据过滤搜索、分页效果
2019/05/28 Javascript
[52:10]LGD vs Optic Supermajor小组赛D组胜者组决赛 BO3 第二场 6.3
2018/06/04 DOTA
[00:20]TI9不朽观赛名额抽取
2019/08/05 DOTA
50行代码实现贪吃蛇(具体思路及代码)
2013/04/27 Python
Python本地与全局命名空间用法实例
2015/06/16 Python
Python中使用bidict模块双向字典结构的奇技淫巧
2016/07/12 Python
Python实现两个list求交集,并集,差集的方法示例
2018/08/02 Python
示例详解Python3 or Python2 两者之间的差异
2018/08/23 Python
python 调用钉钉机器人的方法
2019/02/20 Python
Python图像处理库PIL的ImageFilter模块使用介绍
2020/02/26 Python
使用Vue.js和MJML创建响应式电子邮件
2021/03/23 Vue.js
应用外语系自荐信
2014/06/26 职场文书
金秋助学感谢信
2015/01/21 职场文书
责任书格式
2015/01/29 职场文书
Python机器学习之基于Pytorch实现猫狗分类
2021/06/08 Python
Java实现给Word文件添加文字水印
2022/02/15 Java/Android
使用Bandicam录制鼠标指针并附带点击声音,还可以添加点击动画效果
2022/04/11 数码科技
Java 数组的使用
2022/05/11 Java/Android