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函数
Feb 16 PHP
php下批量挂马和批量清马代码
Feb 27 PHP
php中防止伪造跨站请求的小招式
Sep 02 PHP
php自动注册登录验证机制实现代码
Dec 20 PHP
php中实现xml与mysql数据相互转换的方法
Dec 25 PHP
Symfony数据校验方法实例分析
Jan 26 PHP
php实现以只读方式打开文件的方法
Mar 16 PHP
PHP中应该避免使用同名变量(拆分临时变量)
Apr 03 PHP
Laravel最佳分割路由文件(routes.php)的方式
Aug 04 PHP
PHP CURL post数据报错 failed creating formpost data
Oct 16 PHP
用PHP将Unicode 转化为UTF-8的实现方法(推荐)
Feb 08 PHP
PHP输出XML格式数据的方法总结
Feb 08 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以及MYSQL日期比较方法
2012/11/29 PHP
php源代码安装常见错误与解决办法分享
2013/05/28 PHP
PHP常用的小程序代码段
2015/11/14 PHP
php利用云片网实现短信验证码功能的示例代码
2017/11/18 PHP
ThinkPHP3.2.3框架实现的空模块、空控制器、空操作,跳转到错误404页面图文详解
2019/04/03 PHP
浅谈laravel中的关联查询with的问题
2019/10/10 PHP
jquery实现个人中心导航菜单效果和美观都非常不错
2014/09/02 Javascript
JavaScript中string转换成number介绍
2014/12/31 Javascript
JavaScript常用的返回,自动跳转,刷新,关闭语句汇总
2015/01/13 Javascript
使用jQuery+EasyUI实现CheckBoxTree的级联选中特效
2015/12/06 Javascript
jQuery设置Easyui校验规则(推荐)
2016/11/21 Javascript
JavaScript轮播图简单制作方法
2017/02/20 Javascript
Vue响应式原理详解
2017/04/18 Javascript
AngularJS自定义指令详解(有分页插件代码)
2017/06/12 Javascript
完美解决mui框架off-canvas侧滑超出部分隐藏无法滚动的问题
2018/01/25 Javascript
浅谈Webpack 是如何加载模块的
2018/05/24 Javascript
小程序实现页面顶部选项卡效果
2018/11/06 Javascript
详解在微信小程序的JS脚本中使用Promise来优化函数处理
2019/03/06 Javascript
vue多层嵌套路由实例分析
2019/03/19 Javascript
node express使用HTML模板的方法示例
2019/08/22 Javascript
JS XMLHttpRequest原理与使用方法深入详解
2020/04/30 Javascript
angular中的post请求处理示例详解
2020/06/30 Javascript
[01:33]一分钟玩转DOTA2第三弹:DOTA2&DotA快捷操作大对比
2014/06/04 DOTA
Python实现批量下载图片的方法
2015/07/08 Python
简单了解python中对象的取反运算符
2019/07/01 Python
解决Python3.7.0 SSL低版本导致Pip无法使用问题
2020/09/03 Python
python super()函数的基本使用
2020/09/10 Python
英国在线发型和美容产品商店:Beauty Cutie
2019/04/27 全球购物
艺术学院毕业生自我评价
2014/03/02 职场文书
公司领导班子召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
大学生实习证明
2015/06/16 职场文书
员工给公司的建议书
2019/06/24 职场文书
导游词之河姆渡遗址博物馆
2019/10/10 职场文书
三十年再续同学情倡议书
2019/11/27 职场文书
5种方法告诉你如何使JavaScript 代码库更干净
2021/09/15 Javascript
Python中的tkinter库简单案例详解
2022/01/22 Python