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 相关文章推荐
自己动手做一个SQL解释器
Oct 09 PHP
php代码运行时间查看类代码分享
Aug 06 PHP
php比较两个绝对时间的大小
Jan 31 PHP
PHP使用CURL获取302跳转后的地址实例
May 04 PHP
十大使用PHP框架的理由
Sep 26 PHP
学习php设计模式 php实现享元模式(flyweight)
Dec 07 PHP
thinkphp框架下404页面设置 仅三步
May 14 PHP
详解WordPress中添加友情链接的方法
May 21 PHP
Yii2分页的使用及其扩展方法详解
May 23 PHP
Yii1.1中通过Sql查询进行的分页操作方法
Mar 16 PHP
laravel框架创建授权策略实例分析
Nov 22 PHP
Laravel 框架基于自带的用户系统实现登录注册及错误处理功能分析
Apr 14 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处理restful请求的路由类分享
2014/02/27 PHP
php按单词截取字符串的方法
2015/04/07 PHP
js验证表单大全
2006/11/25 Javascript
兼容IE和FF的js脚本代码小结(比较常用)
2010/12/06 Javascript
关于JavaScript与HTML的交互事件
2013/04/12 Javascript
jquery插件bxslider用法实例分析
2015/04/16 Javascript
Ext JS框架程序中阻止键盘触发回退或者刷新页面的代码分享
2016/06/07 Javascript
JS使用插件cryptojs进行加密解密数据实例
2017/05/11 Javascript
JavaScript基于activexobject连接远程数据库SQL Server 2014的方法
2017/07/12 Javascript
jQuery Ajax 实现分页 kkpager插件实例代码
2017/08/10 jQuery
js实现简单的日历显示效果函数示例
2019/11/25 Javascript
[02:28]DOTA2亚洲邀请赛附加赛 RECAP赛事回顾
2015/01/29 DOTA
[14:03]2017DOTA2亚洲邀请赛开幕式:12神兵演绎水墨中华
2017/04/01 DOTA
windows系统中python使用rar命令压缩多个文件夹示例
2014/05/06 Python
在Django的通用视图中处理Context的方法
2015/07/21 Python
python 队列详解及实例代码
2016/10/18 Python
Python continue继续循环用法总结
2018/06/10 Python
python实现对csv文件的列的内容读取
2018/07/04 Python
python3.x 将byte转成字符串的方法
2018/07/17 Python
解决Pycharm下面出现No R interpreter defined的问题
2018/10/29 Python
Python 实现文件打包、上传与校验的方法
2019/02/13 Python
Python3标准库之functools管理函数的工具详解
2020/02/27 Python
Python根据指定文件生成XML的方法
2020/06/29 Python
用python实现前向分词最大匹配算法的示例代码
2020/08/06 Python
基于python实现图片转字符画代码实例
2020/09/04 Python
计算 s=(x*y)1/2,用两个宏定义来实现
2016/08/11 面试题
国际商务专业学生个人的自我评价
2013/09/28 职场文书
时尚休闲吧创业计划书
2014/01/25 职场文书
梅花魂教学反思
2014/04/25 职场文书
农村党支部书记党群众路线四风问题整改措施
2014/09/26 职场文书
学期个人工作总结
2015/02/13 职场文书
信访工作个人总结
2015/03/03 职场文书
node.js如何自定义实现一个EventEmitter
2021/07/16 Javascript
SpringMVC 整合SSM框架详解
2021/08/30 Java/Android
python脚本框架webpy模板控制结构
2021/11/20 Python
Python OpenCV形态学运算示例详解
2022/04/07 Python