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 相关文章推荐
用session做客户验证时的注意事项
Oct 09 PHP
用php实现让页面只能被百度gogole蜘蛛访问的方法
Dec 29 PHP
php输出xml格式字符串(用的这个)
Jul 12 PHP
PHP微框架Dispatch简介
Jun 12 PHP
从零开始学YII2框架(二)通过 Composer 安装扩展插件
Aug 20 PHP
PHP模拟asp中response类实现方法
Aug 08 PHP
关于PHP中字符串与多进制转换函数的实例代码
Nov 03 PHP
Zend Framework过滤器Zend_Filter用法详解
Dec 09 PHP
php简单生成一组与多组随机字符串的方法
May 09 PHP
PHP实现动态删除XML数据的方法示例
Mar 30 PHP
微信JSSDK分享功能图文实例详解
Apr 08 PHP
thinkphp5 redis缓存新增方法实例讲解
Mar 24 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学习教程之第1天
2008/06/15 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(六)
2014/06/23 PHP
php实现在服务器上创建目录的方法
2015/03/16 PHP
PHP对称加密算法(DES/AES)类的实现代码
2017/11/14 PHP
thinkPHP5框架中widget的功能与用法详解
2018/06/11 PHP
PHP使用 Imagick 扩展实现图片合成,圆角处理功能示例
2019/09/09 PHP
JS判断是否为数字,是否为整数,是否为浮点数的代码
2010/04/24 Javascript
jQuery 源码分析笔记(6) jQuery.data
2011/06/08 Javascript
JQuery遍历json数组的3种方法
2014/11/08 Javascript
asp.net中oracle 存储过程(图文)
2015/08/12 Javascript
AngularJS实现数据列表的增加、删除和上移下移等功能实例
2016/09/05 Javascript
Bootstrap popover用法详解
2016/12/22 Javascript
JS及JQuery对Html内容编码,Html转义
2017/02/17 Javascript
Vue的Flux框架之Vuex状态管理器
2017/07/30 Javascript
mac上配置Android环境变量的方法
2018/07/08 Javascript
vue-自定义组件传值的实例讲解
2018/09/18 Javascript
你不知道的Vue技巧之--开发一个可以通过方法调用的组件(推荐)
2019/04/15 Javascript
Vue项目中使用WebUploader实现文件上传的方法
2019/07/21 Javascript
Vue函数式组件的应用实例详解
2019/08/30 Javascript
vue+vant使用图片预览功能ImagePreview的问题解决
2020/04/10 Javascript
在vue项目中 实现定义全局变量 全局函数操作
2020/10/26 Javascript
Python中的装饰器用法详解
2015/01/14 Python
火车票抢票python代码公开揭秘!
2018/03/08 Python
Python中常用的内置方法
2019/01/28 Python
python如何给字典的键对应的值为字典项的字典赋值
2019/07/05 Python
简单了解Django ORM常用字段类型及参数配置
2020/01/07 Python
python with (as)语句实例详解
2020/02/04 Python
Python中使用socks5设置全局代理的方法示例
2020/04/15 Python
使用PyQt的QLabel组件实现选定目标框功能的方法示例
2020/05/19 Python
详解python3 GUI刷屏器(附源码)
2021/02/18 Python
雪花秀美国官方网站:韩国著名草本护肤化妆品品牌
2016/10/19 全球购物
为奢侈时尚带来了慈善元素:Olivela
2018/09/29 全球购物
抗洪救灾先进集体事迹材料
2014/05/26 职场文书
2015年青年教师工作总结
2015/05/25 职场文书
导游词之凤凰古城
2019/10/22 职场文书
MySQL选择合适的备份策略和备份工具
2022/06/01 MySQL