算法 -- 求最长公共字符串&PHP
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的更多相关文章
- POJ 3080 Blue Jeans (求最长公共字符串)
POJ 3080 Blue Jeans (求最长公共字符串) Description The Genographic Project is a research partnership between ...
- Java算法——求出两个字符串的最长公共字符串
问题:有两个字符串str1和str2,求出两个字符串中最长公共字符串. 例如:“acbbsdef”和"abbsced"的最长公共字符串是“bbs” 算法思路: 1.把两个字符串分别 ...
- Java实现 LeetCode 583 两个字符串的删除操作(求最长公共子序列问题)
583. 两个字符串的删除操作 给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符. 示例: 输入: " ...
- 文本比较算法Ⅱ——Needleman/Wunsch算法的C++实现【求最长公共子串(不需要连续)】
算法见:http://www.cnblogs.com/grenet/archive/2010/06/03/1750454.html 求最长公共子串(不需要连续) #include <stdio. ...
- 求字符串A与字符串B的最长公共字符串(JAVA)
思路:引入一个矩阵的思想,把字符串A(长度为m)当成矩阵的行,把字符串B(长度为n)当矩阵的列.这样就构成一个m*n的矩阵.若该矩阵的节点相应的字符同样,即m[i]=n[j]时.该节点值为1:当前字符 ...
- 后缀数组(模板题) - 求最长公共子串 - poj 2774 Long Long Message
Language: Default Long Long Message Time Limit: 4000MS Memory Limit: 131072K Total Submissions: 21 ...
- [algorithm]求最长公共子序列问题
最直白方法:时间复杂度是O(n3), 空间复杂度是常数 reference:http://blog.csdn.net/monkeyandy/article/details/7957263 /** ** ...
- 计蒜之道 初赛 第三场 题解 Manacher o(n)求最长公共回文串 线段树
腾讯手机地图 腾讯手机地图的定位功能用到了用户手机的多种信号,这当中有的信号的作用范围近.有的信号作用的范围则远一些.有的信号相对于用户在不同的方位强度是不同的,有的则是在不论什么一个方向上信号强度都 ...
- poj 2774 Long Long Message,后缀数组,求最长公共子串 hdu1403
题意:给出两个字符串,求最长公共子串的长度. 题解:首先将两个字符串连在一起,并在中间加一个特殊字符(字串中不存在的)切割,然后两个串的最长公共字串就变成了全部后缀的最长公共前缀.这时就要用到heig ...
随机推荐
- 【转载】Eclipse 的快捷键以及文档注释、多行注释的快捷键
一.多行注释快捷键 1.选中你要加注释的区域,用ctrl+shift+C 或者ctrl+/ 会加上//注释2.先把你要注释的东西选中,用shit+ctrl+/ 会加上/* */注释 3.以上快捷 ...
- elastaicsearch基础----->elastaicsearch的使用(一)
这里面我们总结一下es的一些基础使用. es的基础用法 一.es索引的创建 在postman中,请求url地址:192.168.1.112:9200/user.请求方式:PUT.请求内容如下: { & ...
- JS中判断一个对象是否为null、undefined、0
1.判断undefined: var tmp = undefined; if (typeof(tmp) == "undefined"){ alert("undefined ...
- day_4.30 py
2018-4-30 13:02:32 ''' 多态:只有当调用方法的时候才知道调用父类 还是子类的方法(随变化而变化,等到真正实行的时候才知道结果) 面向对象三个特点: 封装 继承 多态 ''' cl ...
- 网络通信协议二之ISO/OSI参考模型
OSI介绍 >>Open System Interconnection,简称ISO/OSI RM >>是一个逻辑结构,并非一个具体的计算机设备或网络 >>任何两个遵 ...
- ELK之elasticsearch6安装认证模块search guard
参考:https://www.cnblogs.com/marility/p/9392645.html 1,安装环境及软件版本 程序 版本 安装方式 elasticsearch 6.3.1 rpm ...
- at MySql.Data.MySqlClient.MySqlStream.ReadPacket 或 FUNCTION account.AddMinutes does not exist
Application Exception MySql.Data.MySqlClient.MySqlException FUNCTION account.AddMinutes does not exi ...
- easyui tree 更改图标
easyui tree 更改图标 ,onLoadSuccess: function (node, data) { $('#tt .tree-icon').css("background&qu ...
- TOP100summit2017:网易云通信与视频CTO赵加雨:外力推动下系统架构的4个变化趋势
壹佰案例:很荣幸邀请到您成为第六届壹佰案例峰会架构专场的联席主席,您曾深度参与Cisco Jabber,Webex Meeting, Cisco Spark等多项分布式实时通信类产品的架构与研发, ...
- yum下载rpm包
方法一:downloadonly插件 1.安装插件 yum -y install yum-download 2.下载httpd软件包到当前文件夹内 yum -y install httpd -dow ...