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读取IMAP邮件
Oct 09 PHP
用PHP将网址字符串转换成超链接(网址或email)
May 25 PHP
php连接函数implode与分割explode的深入解析
Jun 26 PHP
php实现递归与无限分类的方法
Feb 16 PHP
php实现在服务器上创建目录的方法
Mar 16 PHP
php计算函数执行时间的方法
Mar 20 PHP
php+html5基于websocket实现聊天室的方法
Jul 17 PHP
PHP的Yii框架中Model模型的学习教程
Mar 29 PHP
PHP排序算法之冒泡排序(Bubble Sort)实现方法详解
Apr 20 PHP
PHP连接sftp并下载文件的方法教程
Aug 26 PHP
详解php协程知识点
Sep 21 PHP
Yii框架学习笔记之应用组件操作示例
Nov 13 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 zend 相对路径问题
2009/01/12 PHP
phplock(php进程锁) v1.0 beta1
2009/11/24 PHP
PHP读取数据库并按照中文名称进行排序实现代码
2013/01/29 PHP
基于empty函数的输出详解
2013/06/17 PHP
初识php MVC
2014/09/10 PHP
PHP改进计算字符串相似度的函数similar_text()、levenshtein()
2014/10/27 PHP
给WordPress的编辑后台添加提示框的代码实例分享
2015/12/25 PHP
thinkPHP3.2简单实现文件上传的方法
2016/05/16 PHP
php类自动装载、链式操作、魔术方法实现代码
2017/07/23 PHP
PHP新特性之字节码缓存和内置服务器
2017/08/11 PHP
PDO实现学生管理系统
2020/03/21 PHP
纯js实现的论坛常用的运行代码的效果
2008/07/15 Javascript
对xmlHttp对象方法和属性的理解
2011/01/17 Javascript
css transform 3D幻灯片特效实现步骤解读
2013/03/27 Javascript
javascript实现的DES加密示例
2013/10/30 Javascript
javascript客户端遍历控件与获取父容器对象示例代码
2014/01/06 Javascript
JavaScript 对象字面量讲解
2016/06/06 Javascript
vue省市区三联动下拉选择组件的实现
2017/04/28 Javascript
Vue2.0点击切换类名改变样式的方法
2018/08/22 Javascript
Vue在 Nuxt.js 中重定向 404 页面的方法
2019/04/23 Javascript
微信小程序判断页面是否从其他页面返回的实例代码
2019/07/03 Javascript
Vue axios与Go Frame后端框架的Options请求跨域问题详解
2020/03/03 Javascript
vuex Module将 store 分割成模块的操作
2020/12/07 Vue.js
[05:07]DOTA2英雄梦之声_第14期_暗影恶魔
2014/06/20 DOTA
Python和Ruby中each循环引用变量问题(一个隐秘BUG?)
2014/06/04 Python
Python3.6安装及引入Requests库的实现方法
2018/01/24 Python
利用Python如何实现一个小说网站雏形
2018/11/23 Python
OpenCV哈里斯(Harris)角点检测的实现
2020/01/15 Python
Python PyPDF2模块安装使用解析
2020/01/19 Python
停车场管理协议书范本
2014/10/08 职场文书
2014最新自愿离婚协议书范本
2014/11/19 职场文书
社区义诊通知
2015/04/24 职场文书
2015年学校办公室主任工作总结
2015/07/20 职场文书
JavaScript 语句之常用 for 循环详解
2021/03/29 Javascript
Pytorch可视化的几种实现方法
2021/06/10 Python
mysql的Buffer Pool存储及原理
2022/04/02 MySQL