https://blog.csdn.net/hongyuancao/article/details/83308093

本文是利用PHP,求最长公共字符串。
思路:利用动态规划和矩阵的思想。

动态规划:就是用空间的代价来争取时间,将中间结果保存下来,后面循环使用供,减少重复计算次数。

矩阵思想:定义一个矩阵,宽和高分别为两个字符串的长度。从上到下、从左到右逐个扫描,每次扫描要比较矩阵中每个点对应的行列字符是否相等, 相等的话等于左上邻+1,不相等则置为0。

时间复杂度:矩阵中的长和宽的乘积即为复杂度。复杂度为O(mn)。

如两个字符串:“abcd”和“ebc”。如下图所示:

注:为什么相等的话要等于左上邻+1?因为左上邻代表两个字符串的各自前一个元素,如果前一个元素是对应相等的,且当前位置的对应元素也相等,那么公共字符串的长度需要+1,因此等于左上邻+1。

求最长公共字符串的代码如下:

function getLongestSameStr($a, $b)
{
if (empty($a) || empty($b)) return ;
// 判断字符串是否包含
if (strlen($a) > strlen($b)) {
if (strstr($a, $b) != '') return $b;
} else {
if (strstr($b, $a) != '') return $a;
} $same_arr = [];// 矩阵
$same_str = [];// 所有相同的字符串
$a_len = strlen($a);
$b_len = strlen($b);
$longest_str = ;// 最长的字符串
for ($i = ; $i < $a_len; $i++) {
for ($j = ; $j < $b_len; $j++) {
if ($a[$i] == $b[$j]) {
if ($i > && $j > ) {
$same_arr[$i][$j] = $same_arr[$i - ][$j - ] + ;
} else {
$same_arr[$i][$j] = ;
}
// 所有相同长度的字符串
$longest_str = max($longest_str, $same_arr[$i][$j]);
$same_str[] = substr($a, $i - $same_arr[$i][$j] + , $same_arr[$i][$j]);
} else {
$same_arr[$i][$j] = ;
}
}
}
// 最长的相同字符串
$longest_same_str = [];
foreach ($same_str as $v) {
if ($longest_str == strlen($v)) {
$longest_same_str[] = $v;
}
}
return $longest_same_str;
}

实例如下,随便定义两个字符串,$a和$b,调用此函数。

$a = '11111111abced3212334123wqeqwe156123456789';
$b = '111222abced3213346262qweqweqweqwe64123456789';
$aaa = getLongestSameStr($a, $b);
echo '<pre>';
print_r($aaa);
输出结果为:

Array
(
[] =>
)
假如设定特殊的字符串,如$a和$b有两个公共的相同长度的字符串,调用次函数后会出现两个字符串。 $a = '11111111abced321334123wqeqwa12345678901';
$b = '111222abced3213346262qweqweqweqweb12345678901';
$aaa = getLongestSameStr($a, $b);
echo '<pre>';
print_r($aaa);
结果如下: Array
(
[] => abced321334
[] =>
)
达到了预期的效果。

算法 -- 求最长公共字符串&PHP的更多相关文章

  1. POJ 3080 Blue Jeans (求最长公共字符串)

    POJ 3080 Blue Jeans (求最长公共字符串) Description The Genographic Project is a research partnership between ...

  2. Java算法——求出两个字符串的最长公共字符串

    问题:有两个字符串str1和str2,求出两个字符串中最长公共字符串. 例如:“acbbsdef”和"abbsced"的最长公共字符串是“bbs” 算法思路: 1.把两个字符串分别 ...

  3. Java实现 LeetCode 583 两个字符串的删除操作(求最长公共子序列问题)

    583. 两个字符串的删除操作 给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符. 示例: 输入: " ...

  4. 文本比较算法Ⅱ——Needleman/Wunsch算法的C++实现【求最长公共子串(不需要连续)】

    算法见:http://www.cnblogs.com/grenet/archive/2010/06/03/1750454.html 求最长公共子串(不需要连续) #include <stdio. ...

  5. 求字符串A与字符串B的最长公共字符串(JAVA)

    思路:引入一个矩阵的思想,把字符串A(长度为m)当成矩阵的行,把字符串B(长度为n)当矩阵的列.这样就构成一个m*n的矩阵.若该矩阵的节点相应的字符同样,即m[i]=n[j]时.该节点值为1:当前字符 ...

  6. 后缀数组(模板题) - 求最长公共子串 - poj 2774 Long Long Message

    Language: Default Long Long Message Time Limit: 4000MS   Memory Limit: 131072K Total Submissions: 21 ...

  7. [algorithm]求最长公共子序列问题

    最直白方法:时间复杂度是O(n3), 空间复杂度是常数 reference:http://blog.csdn.net/monkeyandy/article/details/7957263 /** ** ...

  8. 计蒜之道 初赛 第三场 题解 Manacher o(n)求最长公共回文串 线段树

    腾讯手机地图 腾讯手机地图的定位功能用到了用户手机的多种信号,这当中有的信号的作用范围近.有的信号作用的范围则远一些.有的信号相对于用户在不同的方位强度是不同的,有的则是在不论什么一个方向上信号强度都 ...

  9. poj 2774 Long Long Message,后缀数组,求最长公共子串 hdu1403

    题意:给出两个字符串,求最长公共子串的长度. 题解:首先将两个字符串连在一起,并在中间加一个特殊字符(字串中不存在的)切割,然后两个串的最长公共字串就变成了全部后缀的最长公共前缀.这时就要用到heig ...

随机推荐

  1. Spring MVC Redis 整合笔记

    extends:http://blog.csdn.net/defonds/article/details/48716161, http://blog.csdn.net/java2000_wl/arti ...

  2. 轮滑基础(一)(前摔,葫芦步,推步,A字转弯,弓步转弯)

    轮滑新手入门推荐? [柚子陪你学轮滑轮滑教学]第一集 轮滑安全 1,站: 站立:脚可以成v字,或者平行,手放膝盖或者前伸.平行站立 膝盖相距一拳头左右,两腿间距略小于肩宽.膝盖略弯,腰下压,抬头挺胸 ...

  3. Java NIO学习笔记---I/O与NIO概述

    文章目录: 1.什么是IO 2.什么是Java NIO 3.I/O常见概念 4.为什么使用NIO 5.IO VS NIO 一.什么是IO I/O 或者输入/输出 , 指的是计算机与外部世界或者一个程序 ...

  4. thinkphp或thinkcmf 《文章编辑,文章添加》 访问另一个表的分类,添加入另一个表时将id值以(,)逗号分隔储存,编辑时以(,)逗号分隔并且相等的id值被选中

      首页 显示 的控制器//网贷评级 public function grade(){ $archives = $this->archives_model->where(array('de ...

  5. Javascript合并表格相同内容单元格示例

    效果图: HTML代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http: ...

  6. tomcat的缺少tcnative-1.dll的解决(申明:来源于网络)

    tomcat的缺少tcnative-1.dll的解决 地址:http://blog.csdn.net/topwqp/article/details/7713388

  7. Ubuntu16.04下安装QT5.8

    https://blog.csdn.net/hhrock/article/details/61621044

  8. [No0000142]Outlook通过添加签名 自动添加邮件模板

    新建邮件->alt+F9切换域代码显示. 编写好模板后,全选复制到签名. 2018/05/7_加班申请_高亚斌 工号 姓名 开始时间 结束时间 工作事项 160227 高亚斌 2018/05/7 ...

  9. [No0000131]WCF压缩传输方案整理

    1.WCF进阶:将编码后的字节流压缩传输 2.通过WCF扩展实现消息压缩 3.WCF 消息压缩性能问题及解决方法

  10. day5:字典dict

    1, 判断是不是列表 li = ['lis3a', 'mary', 'lucy', 'hh', 'kk', 'gg', 'mm', 'oo', 'vv'] if type(li) == list: p ...