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 相关文章推荐
phpmyadmin的#1251问题
Nov 25 PHP
实用函数3
Nov 08 PHP
php学习之流程控制实现代码
Jun 09 PHP
计算php页面运行时间的函数介绍
Jul 01 PHP
浅谈php命令行用法
Feb 04 PHP
php实现的日历程序
Jun 18 PHP
Yii2前后台分离及migrate使用(七)
May 04 PHP
深入理解PHP 数组之count 函数
Jun 13 PHP
Yii CGridView用法实例详解
Jul 12 PHP
thinkPHP自动验证、自动添加及表单错误问题分析
Oct 17 PHP
详解php中curl返回false的解决办法
Mar 18 PHP
windows 2008r2+php5.6.28环境搭建详细过程
Jun 18 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
连接到txt文本的超链接,不直接打开而是点击后下载的处理方法
2009/07/01 PHP
解析thinkphp中的M()与D()方法的区别
2013/06/22 PHP
学习php设计模式 php实现单例模式(singleton)
2015/12/07 PHP
php实现小程序支付完整版
2018/10/09 PHP
PHP开启目录引索+fancyindex漂亮目录浏览带搜索功能
2019/09/23 PHP
一个基于jquery的文本框记数器
2012/09/19 Javascript
Javascript图像处理—亮度对比度应用案例
2013/01/03 Javascript
JavaScript版的TwoQueues缓存模型
2014/12/29 Javascript
js/jq仿window文件夹框选操作插件
2017/03/08 Javascript
Vue自定义指令使用方法详解
2017/08/21 Javascript
webpack本地开发环境无法用IP访问的解决方法
2018/03/20 Javascript
angularjs1.5 组件内用函数向外传值的实例
2018/09/30 Javascript
JavaScript&quot;模拟事件&quot;的注意要点详解
2019/02/13 Javascript
Vue 中 filter 与 computed 的区别与用法解析
2019/11/21 Javascript
Element Breadcrumb 面包屑的使用方法
2020/07/26 Javascript
Vue为什么要谨慎使用$attrs与$listeners
2020/08/27 Javascript
一分钟学会JavaScript中的try-catch
2020/12/14 Javascript
[06:42]DOTA2每周TOP10 精彩击杀集锦vol.1
2014/06/25 DOTA
python使用nntp读取新闻组内容的方法
2015/05/08 Python
利用Python破解验证码实例详解
2016/12/08 Python
python爬虫爬取淘宝商品信息(selenum+phontomjs)
2018/02/24 Python
Python 找到列表中满足某些条件的元素方法
2018/06/26 Python
python matplotlib 画dataframe的时间序列图实例
2019/11/20 Python
Python类中self参数用法详解
2020/02/13 Python
Python中zip()函数的解释和可视化(实例详解)
2020/02/16 Python
python百行代码自制电脑端网速悬浮窗的实现
2020/05/12 Python
CSS3属性box-sizing使用指南
2014/12/09 HTML / CSS
Hotter Shoes美国官网:英国最受欢迎的舒适鞋
2018/08/02 全球购物
Hurley官方网站:扎根于海滩生活方式的全球青年文化品牌
2020/05/18 全球购物
中西医结合临床医学专业大学生自荐信
2013/09/28 职场文书
本科毕业生自我鉴定
2013/11/02 职场文书
大班幼儿评语大全
2014/04/30 职场文书
大学生党员个人剖析材料
2014/10/08 职场文书
老干部座谈会主持词
2015/07/03 职场文书
Vue监视数据的原理详解
2022/02/24 Vue.js
Win11无法安装更新补丁KB3045316怎么办 附KB3045316补丁修复教程
2022/08/14 数码科技