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 相关文章推荐
JAVA/JSP学习系列之六
Oct 09 PHP
一个oracle+PHP的查询的例子
Oct 09 PHP
PHP 一个页面执行时间类代码
Mar 05 PHP
php截取utf-8中文字符串乱码的解决方法
Mar 29 PHP
php商品对比功能代码分享
Sep 24 PHP
Thinkphp3.2.3分页使用实例解析
Jul 28 PHP
php 多文件上传的实现实例
Oct 23 PHP
PHP判断数组是否为空的常用方法(五种方法)
Feb 08 PHP
centos下file_put_contents()无法写入文件的原因及解决方法
Apr 01 PHP
PHP中常用的魔术方法
Apr 28 PHP
Laravel ORM 数据model操作教程
Oct 21 PHP
有关PHP 中 config.m4 的探索
Aug 26 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
在Windows系统上安装PHP运行环境文字教程
2010/07/19 PHP
PHP 字符串正则替换函数preg_replace使用说明
2011/07/15 PHP
Django中通过定时任务触发页面静态化的处理方式
2018/08/29 PHP
PHP模型Model类封装数据库操作示例
2019/03/14 PHP
javascript实现unicode和字符的互相转换
2007/07/18 Javascript
javascript 关闭IE6、IE7
2009/06/01 Javascript
jQuery jqgrid 对含特殊字符json 数据的 Java 处理方法
2011/01/01 Javascript
jQuery LigerUI 插件介绍及使用之ligerDrag和ligerResizable示例代码打包
2011/04/06 Javascript
javascript判断非数字的简单例子
2013/07/18 Javascript
一个不错的仿携程自定义数据下拉选择select
2014/09/01 Javascript
javascript创建含数字字母的随机字符串方法总结
2016/08/01 Javascript
xmlplus组件设计系列之树(Tree)(9)
2017/05/02 Javascript
JavaScript中Require调用js的实例分享
2017/10/27 Javascript
微信小程序列表渲染功能之列表下拉刷新及上拉加载的实现方法分析
2017/11/27 Javascript
Vue脚手架的简单使用实例
2018/07/10 Javascript
微信小程序实现侧边栏分类
2019/10/21 Javascript
JS通过识别id、value值对checkbox设置选中状态
2020/02/19 Javascript
原生JS实现微信通讯录
2020/06/18 Javascript
Python实现向服务器请求压缩数据及解压缩数据的方法示例
2017/06/09 Python
详解使用 pyenv 管理多个版本 python 环境
2017/10/19 Python
Django使用httpresponse返回用户头像实例代码
2018/01/26 Python
Python实现的特征提取操作示例
2018/12/03 Python
Python3非对称加密算法RSA实例详解
2018/12/06 Python
Python 加密与解密小结
2018/12/06 Python
基于python实现KNN分类算法
2020/04/23 Python
Django发送邮件和itsdangerous模块的配合使用解析
2019/08/10 Python
美国Rue La La闪购网站:奢侈品、中高档品牌限时折扣
2016/10/19 全球购物
Missguided美国官网:英国时尚品牌
2018/01/18 全球购物
Myholidays美国:在线旅游网站
2019/08/16 全球购物
奖学金自我鉴定范文
2013/10/03 职场文书
师恩难忘教学反思
2014/04/27 职场文书
幼儿教师师德承诺书
2014/05/23 职场文书
党员“四风”问题批评与自我批评思想汇报
2014/10/06 职场文书
祝寿主持词
2015/07/02 职场文书
青年人初次创业的“五不要”
2019/08/23 职场文书
零基础学java之带参数以及返回值的方法
2022/04/10 Java/Android