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 相关文章推荐
抓取YAHOO股票报价的类
May 15 PHP
php pack与unpack 摸板字符字符含义
Oct 29 PHP
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装(win+linux)
May 05 PHP
php实现文件下载更能介绍
Nov 23 PHP
PHP执行批量mysql语句的解决方法
May 02 PHP
PHP 安全检测代码片段(分享)
Jul 05 PHP
php对包含html标签的字符串进行截取的函数分享
Jun 19 PHP
smarty自定义函数htmlcheckboxes用法实例
Jan 22 PHP
php获得文件夹下所有文件的递归算法的简单实例
Nov 01 PHP
yii 2.0中表单小部件的使用方法示例
May 23 PHP
PHP利用Mysql锁解决高并发的方法
Sep 04 PHP
php操作redis数据库常见方法实例总结
Feb 20 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 日常开发小技巧
2009/09/23 PHP
thinkphp实现发送邮件密码找回功能实例
2014/12/01 PHP
PHP使用header()输出图片缓存实例
2014/12/09 PHP
php mysql_real_escape_string addslashes及mysql绑定参数防SQL注入攻击
2016/12/23 PHP
Laravel 5.4.36中session没有保存成功问题的解决
2018/02/19 PHP
Laravel实现短信注册的示例代码
2018/05/29 PHP
tp5.1 框架join方法用法实例分析
2020/05/26 PHP
用javascript实现读取txt文档的脚本
2007/07/20 Javascript
jQuery实现切换页面布局使用介绍
2011/10/09 Javascript
基于JQuery模仿苹果桌面的Dock效果(初级版)
2012/10/15 Javascript
jquery实现图片渐变切换兼容ie6/Chrome/Firefox
2013/08/02 Javascript
常用的JavaScript WEB操作方法分享
2015/02/28 Javascript
canvas滤镜效果实现代码
2017/02/06 Javascript
JS动态修改网页body的背景色实例代码
2017/10/07 Javascript
JS正则表达式完美实现身份证校验功能
2017/10/18 Javascript
EasyUI的DataGrid绑定Json数据源的示例代码
2017/12/16 Javascript
vue父组件异步获取数据传给子组件的方法
2018/07/26 Javascript
详解vue-cli脚手架中webpack配置方法
2018/08/22 Javascript
vue 移动端适配方案详解
2018/11/15 Javascript
JS使用new操作符创建对象的方法分析
2019/05/30 Javascript
[04:53]DOTA2英雄基础教程 祈求者
2014/01/03 DOTA
用Python编写一个简单的FUSE文件系统的教程
2015/04/02 Python
python 多线程实现检测服务器在线情况
2015/11/25 Python
玩转python selenium鼠标键盘操作(ActionChains)
2020/04/12 Python
Python二次规划和线性规划使用实例
2019/12/09 Python
python数据处理——对pandas进行数据变频或插值实例
2020/04/22 Python
Python判断远程服务器上Excel文件是否被人打开的方法
2020/07/13 Python
使用sublime text3搭建Python编辑环境的实现
2021/01/12 Python
详解基于canvas的视频遮罩插件
2018/01/04 HTML / CSS
留学推荐信写作指南
2014/01/25 职场文书
酒店开业庆典策划方案
2014/05/28 职场文书
体育教师个人工作总结
2015/02/09 职场文书
城南旧事读书笔记
2015/06/29 职场文书
2015年秋季灭鼠工作总结
2015/07/27 职场文书
安全主题班会教案
2015/08/12 职场文书
2016暑期校本培训心得体会
2016/01/08 职场文书