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网页木马一枚 附PHP木马的防范方法
Oct 09 PHP
CMS中PHP判断系统是否已经安装的方法示例
Jul 26 PHP
Thinkphp+smarty+uploadify实现无刷新上传
Jul 30 PHP
Yii基于数组和对象的Model查询技巧实例详解
Dec 28 PHP
php bootstrap实现简单登录
Mar 08 PHP
PHP自定义函数获取URL中一级域名的方法
Aug 23 PHP
PHP快速排序quicksort实例详解
Sep 28 PHP
php UNIX时间戳用法详解
Feb 16 PHP
Laravel推荐使用的十个辅助函数
May 10 PHP
解决thinkPHP 5 nginx 部署时,只跳转首页的问题
Oct 16 PHP
PHP Ajax跨域问题解决方案代码实例
Aug 01 PHP
PHP7 字符串处理机制修改
Mar 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
PHP中对数据库操作的封装
2006/10/09 PHP
global.php
2006/12/09 PHP
ThinkPHP的I方法使用详解
2014/06/18 PHP
PHP开发中解决并发问题的几种实现方法分析
2017/11/13 PHP
php生成HTML文件的类方法
2019/10/11 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
jQuery团购倒计时特效实现方法
2015/05/07 Javascript
AngularJS使用ngMessages进行表单验证
2015/12/27 Javascript
深入理解JS addLoadEvent函数
2016/05/20 Javascript
JS实现图片局部放大或缩小的方法
2016/08/20 Javascript
angularjs 中$apply,$digest,$watch详解
2016/10/13 Javascript
分类解析jQuery选择器
2016/11/23 Javascript
详解nodeJS中读写文件方法的区别
2017/03/06 NodeJs
Angualrjs 表单验证的两种方式(失去焦点验证和点击提交验证)
2017/05/09 Javascript
bootstrap手风琴折叠示例代码分享
2017/05/22 Javascript
详解用webpack把我们的业务模块分开打包的方法
2017/07/20 Javascript
基于angular6.0实现的一个组件懒加载功能示例
2018/04/12 Javascript
基于Vue实现拖拽功能
2020/07/29 Javascript
使用ECharts实现状态区间图
2018/10/25 Javascript
开源一个微信小程序仪表盘组件过程解析
2019/07/30 Javascript
Python获取文件所在目录和文件名的方法
2017/01/12 Python
Python信息抽取之乱码解决办法
2017/06/29 Python
在Python中执行系统命令的方法示例详解
2017/09/14 Python
Python将列表数据写入文件(txt, csv,excel)
2019/04/03 Python
Django 简单实现分页与搜索功能的示例代码
2019/11/07 Python
Python enumerate内置库用法解析
2020/02/24 Python
详解Python3.8+PyQt5+pyqt5-tools+Pycharm配置详细教程
2020/11/02 Python
Python如何实现Paramiko的二次封装
2021/01/30 Python
详解css3 mask遮罩实现一些特效
2018/10/24 HTML / CSS
CSS3 选择器 伪类选择器介绍
2012/01/21 HTML / CSS
详解如何将 Canvas 绘制过程转为视频
2021/01/25 HTML / CSS
环保建议书300字
2014/05/14 职场文书
三好学生事迹材料
2014/12/24 职场文书
公司借款担保书
2015/09/22 职场文书
2019消防宣传标语!
2019/07/10 职场文书
国庆节到了,利用JS实现一个生成国庆风头像的小工具 详解实现过程
2021/10/05 Javascript