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 编写大型网站问题集
May 07 PHP
php入门学习知识点七 PHP函数的基本应用
Jul 14 PHP
PHP的加密方式及原理
Jun 14 PHP
php5.3中连接sqlserver2000的两种方法(com与ODBC)
Dec 29 PHP
PHP编码规范的深入探讨
Jun 06 PHP
php获取网页请求状态程序示例
Jun 17 PHP
浅谈PDO的rowCount函数
Jun 18 PHP
[原创]php求圆周率的简单实现方法
May 30 PHP
PHP将字符串首字母大小写转换的实例
Jan 21 PHP
Laravel实现短信注册的示例代码
May 29 PHP
PHP+Ajax简单get验证操作示例
Mar 02 PHP
PHP添加PNG图片背景透明水印操作类定义与用法示例
Mar 12 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.ini中文版(1)
2006/10/09 PHP
php 将bmp图片转为jpg等其他任意格式的图片
2009/06/21 PHP
php explode函数实例代码
2012/02/27 PHP
CodeIgniter框架提示Disallowed Key Characters的解决办法
2014/04/21 PHP
php实现约瑟夫问题的方法小结
2015/03/23 PHP
php检测url是否存在的方法
2015/04/14 PHP
解读PHP中的垃圾回收机制
2015/08/10 PHP
IE无法设置短域名下Cookie
2010/09/23 Javascript
javascript中有趣的反柯里化深入分析
2012/12/05 Javascript
javascript间隔刷新的简单实例
2013/11/14 Javascript
jquery自动切换tabs选项卡的具体实现
2013/12/24 Javascript
分享一个自己写的简单的javascript分页组件
2015/02/15 Javascript
Bootstrap基本布局实现方法详解
2016/11/25 Javascript
Bootstrap实现渐变顶部固定自适应导航栏
2020/08/27 Javascript
微信小程序 textarea 组件详解及简单实例
2017/01/10 Javascript
jQuery实现动态添加、删除按钮及input输入框的方法
2017/04/27 jQuery
JavaScript模拟实现封装的三种方式及写法区别
2017/10/27 Javascript
Vim快速合并行及vim 将文件所有行合并到一行
2017/11/27 Javascript
Angular如何在应用初始化时运行代码详解
2018/06/11 Javascript
JS操作Fckeditor的一些常用方法(获取、插入等)
2020/02/19 Javascript
Python写的PHPMyAdmin暴力破解工具代码
2014/08/06 Python
python编程培训 python培训靠谱吗
2018/01/17 Python
python 列表,数组和矩阵sum的用法及区别介绍
2018/06/28 Python
Python将list元素转存为CSV文件的实现
2020/11/16 Python
实例讲解使用CSS实现多边框和透明边框的方法
2015/09/08 HTML / CSS
CSS3按钮鼠标悬浮实现光圈效果源码
2016/09/11 HTML / CSS
中科方德软件测试面试题
2016/04/21 面试题
MYSQL基础面试题
2012/05/13 面试题
运动会广播稿400字
2014/01/25 职场文书
电子专业求职信
2014/06/19 职场文书
元宵节寄语大全
2015/02/27 职场文书
超市员工辞职信范文
2015/05/12 职场文书
防震减灾主题班会
2015/08/14 职场文书
2016护理专业求职自荐书
2016/01/28 职场文书
小学体育队列队形教学反思
2016/02/16 职场文书
在 Python 中利用 Pool 进行多线程
2022/04/24 Python