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 相关文章推荐
文件上传类
Oct 09 PHP
php基础知识:控制结构
Dec 13 PHP
php中函数的形参与实参的问题说明
Sep 01 PHP
PHP实现提取一个图像文件并在浏览器上显示的代码
Oct 06 PHP
PHP将进程作为守护进程的方法
Mar 19 PHP
基础的WordPress插件制作教程
Nov 24 PHP
PHP中类属性与类静态变量的访问方法示例
Jul 13 PHP
Thinkphp5行为使用方法汇总
Dec 21 PHP
ThinkPHP中获取指定日期后工作日的具体日期方法
Oct 14 PHP
PHP大文件切割上传并带进度条功能示例
Jul 01 PHP
Laravel如何实现自动加载类
Oct 14 PHP
PHP PDO和消息队列的个人理解与应用实例分析
Nov 25 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中调用JAVA
2006/10/09 PHP
无数据库的详细域名查询程序PHP版(1)
2006/10/09 PHP
基于PHP读取TXT文件向数据库导入海量数据的方法
2013/04/23 PHP
使用laravel的migrate创建数据表的方法
2019/09/30 PHP
Javascript 作用域使用说明
2009/08/13 Javascript
容易被忽略的JS脚本特性
2011/09/13 Javascript
Tab切换组件(选项卡功能)实例代码
2013/11/21 Javascript
javascript生成随机大小写字母的方法
2014/02/20 Javascript
浅谈json取值(对象和数组)
2016/06/24 Javascript
Vue.js动态添加、删除选题的实例代码
2016/09/30 Javascript
详解bootstrap的modal-remote两种加载方式【强化】
2017/01/27 Javascript
解决微信内置浏览器返回上一页强制刷新问题方法
2017/02/05 Javascript
json的结构与遍历方法实例分析
2017/04/25 Javascript
vue使用Axios做ajax请求详解
2017/06/07 Javascript
JS实现数组去重方法总结(六种方法)
2017/07/14 Javascript
vuejs事件中心管理组件间的通信详解
2017/08/09 Javascript
jQuery EasyUI Layout实现tabs标签的实例
2017/09/26 jQuery
Element ui 下拉多选时新增一个选择所有的选项
2019/08/21 Javascript
Layui 解决表格异步调用后台分页的问题
2019/10/26 Javascript
python基础教程之Hello World!
2014/08/29 Python
Python遍历指定文件及文件夹的方法
2015/05/09 Python
python实现验证码识别功能
2018/06/07 Python
python 借助numpy保存数据为csv格式的实现方法
2018/07/04 Python
Pandas DataFrame数据的更改、插入新增的列和行的方法
2019/06/25 Python
Laravel框架表单验证格式化输出的方法
2019/09/25 Python
CSS3样式linear-gradient的使用实例
2017/01/16 HTML / CSS
世界上最大的糖果店:Dylan’s Candy Bar
2017/11/07 全球购物
清扬洗发水广告词
2014/03/14 职场文书
竞选体育委员演讲稿
2014/04/26 职场文书
国庆65周年演讲稿:回首往昔,展望未来
2014/09/21 职场文书
单位一把手群众路线四风问题整改措施
2014/09/25 职场文书
党委干部批评与自我批评发言稿
2014/09/28 职场文书
2015新员工试用期工作总结
2014/12/12 职场文书
国庆节慰问信
2015/02/15 职场文书
2015年工程部工作总结
2015/04/30 职场文书
mysql字段为NULL索引是否会失效实例详解
2022/05/30 MySQL