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 相关文章推荐
Zend引擎的发展 [15]
Oct 09 PHP
BBS(php &amp; mysql)完整版(二)
Oct 09 PHP
PHP代码保护--Zend Guard的使用详解
Jun 03 PHP
CodeIgniter框架中_remap()使用方法2例
Mar 10 PHP
PHP错误Warning: Cannot modify header information - headers already sent by解决方法
Sep 27 PHP
php使用fopen创建utf8编码文件的方法
Oct 31 PHP
php常用的url处理函数总结
Nov 19 PHP
php打印一个边长为N的实心和空心菱型的方法
Mar 02 PHP
php检查是否是ajax请求的方法
Apr 16 PHP
Yii框架实现记录日志到自定义文件的方法
May 23 PHP
老生常谈PHP数组函数array_merge(必看篇)
May 25 PHP
laravel ORM关联关系中的 with和whereHas用法
Oct 16 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
星际争霸, 教主第一视角, ZvT经典龙蛇演义
2020/03/02 星际争霸
无JS,完全php面向过程数据分页实现代码
2012/08/27 PHP
关于php支持分块与断点续传文件下载功能代码
2014/05/09 PHP
PHP、Nginx、Apache中禁止网页被iframe引用的方法
2020/10/01 PHP
destoon供应信息title调用出公司名称的方法
2014/08/22 PHP
smarty中英文多编码字符截取乱码问题解决方法
2014/10/28 PHP
php计算title标题相似比的方法
2015/07/29 PHP
PHP的PDO常用类库实例分析
2016/04/07 PHP
php中array_unshift()修改数组key注意事项分析
2016/05/16 PHP
js限制文本框为整数和货币的函数代码
2010/10/13 Javascript
jquery scrollTop方法根据滚动像素显示隐藏顶部导航条
2013/05/27 Javascript
js继承call()和apply()方法总结
2014/12/08 Javascript
js实现每日自动换一张图片的方法
2015/05/04 Javascript
Bootstrap每天必学之表格
2015/11/23 Javascript
Javascript 获取鼠标当前的位置实现方法
2016/10/27 Javascript
jQuery发请求传输中文参数乱码问题的解决方案
2018/05/22 jQuery
vue项目中使用百度地图的方法
2018/06/08 Javascript
jQuery实现的页面弹幕效果【测试可用】
2018/08/17 jQuery
JQuery使用属性addClass、removeClass和toggleClass实现增加和删除类操作示例
2019/11/18 jQuery
javascript实现倒计时效果
2020/02/17 Javascript
vue的webcamjs集成方式
2020/11/16 Javascript
[54:17]DOTA2-DPC中国联赛定级赛 RNG vs iG BO3第二场 1月10日
2021/03/11 DOTA
python完成FizzBuzzWhizz问题(拉勾网面试题)示例
2014/05/05 Python
Python基于PycURL实现POST的方法
2015/07/25 Python
Python使用cookielib模块操作cookie的实例教程
2016/07/12 Python
Python用UUID库生成唯一ID的方法示例
2016/12/15 Python
通过源码分析Python中的切片赋值
2017/05/08 Python
python中的变量如何开辟内存
2018/06/26 Python
Python定时发送消息的脚本:每天跟你女朋友说晚安
2018/10/21 Python
Python转换时间的图文方法
2019/07/01 Python
Python 实现数据结构-循环队列的操作方法
2019/07/17 Python
如何通过安装HomeBrew来安装Python3
2020/12/23 Python
Html5页面点击遮罩层背景关闭遮罩层
2020/11/30 HTML / CSS
法学院方阵解说词
2014/01/29 职场文书
机关搬迁方案
2014/05/18 职场文书
导游词之永济鹳雀楼
2020/01/16 职场文书