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中base64_decode与base64_encode加密解密函数实例
Nov 24 PHP
PHP实现文件下载详解
Nov 27 PHP
浅谈PHP中Stream(流)
Jun 08 PHP
PHP实现通过get方式识别用户发送邮件的方法
Jul 16 PHP
Yii中的relations数据关联查询及统计功能用法详解
Jul 14 PHP
PHP读MYSQL中文乱码的快速解决方法
Oct 01 PHP
phpMyAdmin无法登陆的解决方法
Apr 27 PHP
ThinkPHP 3.2.2实现事务操作的方法
May 05 PHP
php 人员权限管理(RBAC)实例(推荐)
May 24 PHP
PHP实现在对象之外访问其私有属性private及保护属性protected的方法
Nov 20 PHP
PHP设计模式概论【概念、分类、原则等】
May 01 PHP
php7中停止php-fpm服务的方法详解
May 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/12/25 PHP
纯真IP数据库的应用 IP地址转化成十进制
2009/06/14 PHP
PHP获取表单所有复选框的值的方法
2014/08/28 PHP
Laravel框架搜索分页功能示例
2019/02/01 PHP
PPK 谈 JavaScript 的 this 关键字 [翻译]
2009/09/29 Javascript
一起来写段JS drag拖动代码
2010/12/09 Javascript
关于Javascript作用域链的八点总结
2013/12/06 Javascript
js正则表达式中test,exec,match方法的区别说明
2014/01/29 Javascript
用nodejs实现PHP的print_r函数代码
2014/03/14 NodeJs
javascript基于DOM实现省市级联下拉框的方法
2015/05/14 Javascript
基于jquery实现简单的手风琴特效
2015/11/24 Javascript
使用微信内置浏览器点击下拉框出现页面乱跳转现象(iphone),该怎么办
2016/01/04 Javascript
javascript实现在网页中运行本地程序的方法
2016/02/03 Javascript
一个用jquery写的判断div滚动条到底部的方法【推荐】
2016/04/29 Javascript
jQuery1.9+中删除了live以后的替代方法
2016/06/17 Javascript
javascript弹出窗口中增加确定取消按钮
2016/06/24 Javascript
用原生JS对AJAX做简单封装的实例代码
2016/07/13 Javascript
js实现自定义路由
2017/02/04 Javascript
javascript实现的时间格式加8小时功能示例
2019/06/13 Javascript
vue如何限制只能输入正负数及小数
2019/07/04 Javascript
使用url_helper简化Python中Django框架的url配置教程
2015/05/30 Python
Python二叉搜索树与双向链表转换实现方法
2016/04/29 Python
Python打包可执行文件的方法详解
2016/09/19 Python
Python实现读取并保存文件的类
2017/05/11 Python
Python Des加密解密如何实现软件注册码机器码
2020/01/08 Python
Django认证系统user对象实现过程解析
2020/03/02 Python
css3制作彩色边线3d立体按钮的示例(css3按钮)
2014/05/06 HTML / CSS
HTML5中外部浏览器唤起微信分享
2020/01/02 HTML / CSS
html5拖拽应用记录及注意点
2020/05/27 HTML / CSS
进程的查看和调度分别使用什么命令
2013/12/14 面试题
中班中秋节活动反思
2014/02/18 职场文书
个人课题方案
2014/05/08 职场文书
四风问题自查自纠工作情况报告
2014/10/28 职场文书
党的群众路线教育实践活动心得体会(教师)
2014/10/31 职场文书
2015年乡镇统计工作总结
2015/04/22 职场文书
酒店开业主持词
2015/07/02 职场文书