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 相关文章推荐
动态生成gif格式的图像要注意?
Oct 09 PHP
PHP求最大子序列和的算法实现
Jun 24 PHP
php采集文章中的图片获取替换到本地(实现代码)
Jul 08 PHP
配置php网页显示各种语法错误
Sep 23 PHP
php站内搜索关键词变亮的实现方法
Dec 30 PHP
新浪微博OAuth认证和储存的主要过程详解
Mar 27 PHP
php实现的一个简单json rpc框架实例
Mar 30 PHP
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
Dec 14 PHP
PHP 表单提交及处理表单数据详解及实例
Dec 27 PHP
详解json在php中的应用
Sep 30 PHP
PHP中-&gt;和=&gt;的含义及使用示例解析
Aug 06 PHP
PHP实现页面静态化深入讲解
Mar 04 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
调频问题解答
2021/03/01 无线电
PHP中动态HTML的输出技术
2006/10/09 PHP
基于MySQL到MongoDB简易对照表的详解
2013/06/03 PHP
Laravel 4 初级教程之视图、命名空间、路由
2014/10/30 PHP
smarty内置函数{loteral}、{ldelim}和{rdelim}用法实例
2015/01/22 PHP
Javascript 实现TreeView CheckBox全选效果
2010/01/11 Javascript
javascript中最常用的继承模式 组合继承
2010/08/12 Javascript
javascript之bind使用介绍
2011/10/09 Javascript
yepnope.js使用详解及示例分享
2014/06/23 Javascript
jQuery实现的在线答题功能
2015/04/12 Javascript
node.js回调函数之阻塞调用与非阻塞调用
2015/11/13 Javascript
Bootstrap打造一个左侧折叠菜单的系统模板(二)
2016/05/17 Javascript
彻底学会Angular.js中的transclusion
2017/03/12 Javascript
JS设计模式之数据访问对象模式的实例讲解
2017/09/30 Javascript
浅谈Vuejs中nextTick()异步更新队列源码解析
2017/12/31 Javascript
vue项目中引入vue-datepicker插件的详解
2019/05/14 Javascript
Vue实现浏览器打印功能的代码
2020/04/17 Javascript
使用Python编写基于DHT协议的BT资源爬虫
2016/03/19 Python
Python编写一个闹钟功能
2017/07/11 Python
Python使用正则表达式过滤或替换HTML标签的方法详解
2017/09/25 Python
微信跳一跳小游戏python脚本
2018/01/05 Python
Python 实现子类获取父类的类成员方法
2019/01/11 Python
python同义词替换的实现(jieba分词)
2020/01/21 Python
德国网上超市:myTime.de
2019/08/26 全球购物
如何配置、使用和清除Smarty缓存
2015/12/23 面试题
个人实用简单的自我评价
2013/10/19 职场文书
美工的岗位职责
2013/11/14 职场文书
播音主持女孩的自我评价分享
2013/11/20 职场文书
超市中秋节促销方案
2014/03/21 职场文书
1亿有多大教学反思
2014/05/01 职场文书
个人欠款担保书
2014/05/20 职场文书
社区综治工作汇报
2014/10/27 职场文书
幼儿园教学工作总结2015
2015/05/12 职场文书
css实现文章分割线样式的多种方法总结
2021/04/21 HTML / CSS
Element-ui Layout布局(Row和Col组件)的实现
2021/12/06 Vue.js
宫崎骏十大动画电影,宫崎骏好看的动画电影排名
2022/03/22 日漫